2014-09-30 66 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