2013-10-15 110 views
3

如何運行一個數據框並只返回滿足特定條件的行?必須在前面的行和列上測試此情況。例如:通過熊貓數據框迭代的最快方法?

  #1 #2 #3 #4 
1/1/1999 4  2  4  5 
1/2/1999 5  2  3  3 
1/3/1999 5  2  3  8 
1/4/1999 6  4  2  6 
1/5/1999 8  3  4  7 
1/6/1999 3  2  3  8 
1/7/1999 1  3  4  1 

我想測試於各行的幾個條件,如果所有條件都過去了,我想追加行上市。例如:

for row in dataframe: 
    if [row-1, column 0] + [row-2, column 3] >= 6: 
     append row to a list 

我最多可能有3個條件,對於要返回的行必須爲true。 正在考慮這樣做的方法是爲每個條件制定一個真實 的觀察列表,然後爲所有出現在所有三個列表中的所有行製作單獨的列表。

我的兩個問題有以下幾點:

什麼是讓所有符合基於先前行一定條件的行的最快的方法是什麼?通過5000行數據幀循環似乎可能太長。特別是如果有潛在的3個條件需要測試。

獲得滿足所有3個條件的行列表的最佳方式是什麼?

回答

5

選擇行的最快方法是對而不是遍歷數據幀的行。相反,創建一個掩碼(布爾數組)與您要選擇的行真值,然後調用df[mask]選擇它們:

mask = (df['column 0'].shift(1) + df['column 3'].shift(2) >= 6) 
newdf = df[mask] 

要使用邏輯和,使用結合多個條件&

mask = ((...) & (...)) 

對於邏輯或使用|

mask = ((...) | (...)) 

例如,

In [75]: df = pd.DataFrame({'A':range(5), 'B':range(10,20,2)}) 

In [76]: df 
Out[76]: 
    A B 
0 0 10 
1 1 12 
2 2 14 
3 3 16 
4 4 18 

In [77]: mask = (df['A'].shift(1) + df['B'].shift(2) > 12) 

In [78]: mask 
Out[78]: 
0 False 
1 False 
2 False 
3  True 
4  True 
dtype: bool 

In [79]: df[mask] 
Out[79]: 
    A B 
3 3 16 
4 4 18 
+0

謝謝!正是我在找什麼! – user1367204