2014-09-30 28 views
2

一些背景:我的代码需要用户输入并将其应用于我的DF以删除特定的行。这个过程可以重复用户所希望的次数。不幸的是,我不知道如何使其保持正在发生变化更新我创建了while循环中我DF:在while循环期间更新熊猫DF(Python3,Pandas)

data = ({'hello':['the man','is a','good guy']}) 
df = pd.DataFrame(data) 

def func(): 
    while True: 
     n = input('Words: ') 
     if n == "Done": 
      break 
     elif n != "Done": 
      pattern = '^'+''.join('(?=.*{})'.format(word) for word in n.split()) 
      df[df['hello'].str.contains(pattern)==False] 

如何在每一个循环,这样的变化的结束时更新的DF被保持放?

+0

使用'loc'开始func: 'df.loc [df ['hello']。str.contains(pattern)== False,'col'] = newVal' – EdChum 2014-09-30 07:18:17

+0

不确定这段代码是如何工作的?如果你不介意,你可以多解释一下吗? – user3682157 2014-09-30 14:26:05

+0

'loc'使用基于标签的索引查看文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#different-choices-for-indexing-loc-iloc-and-ix – EdChum 2014-09-30 15:17:16

回答

0

好的,我重新评估了你的问题,我的旧回答当然是完全错误的。

你想要的是DataFrame.drop method。这可以在现场完成。

mask = df['hello'].str.contains(pattern) 
df.drop(mask, inplace=True) 

这将更新您的DataFrame。

0

在我看来,你已经完成了所有的辛苦工作,但有两个问题。

  1. 您的最后一行不会将结果存储在任何地方。大多数熊猫的操作不是“就地”的,这意味着您必须将结果存储在某个地方以便稍后使用。

  2. df是一个全局变量,并且在一个函数内设置它的值不起作用,除非你明确地有一行说明global df有关更多详细信息,请参见this question的完美答案。

所以我认为你只需要做:

df = df[df['hello'].str.contains(pattern)==False] 

解决的问题之一。

对于问题二,在func后,请return df那么当你调用func调用它:

df = func(df) 

OR,用线

global df