2016-03-07 49 views
0

我想知道現有的熊貓功能,目前爲止我可能找不到。基本上,我有一個數據框與各種列。我想根據某些colums的值選擇特定的行(僅供參考:我對列D的值感興趣,其中有幾個參數在A-C中描述)。在Python數據框中迭代地過濾數據

E.g.我想知道哪些行有A == 1 & B == 2 & C == 5?

df 
    A B C D 
0 1 2 4 a 
1 1 2 5 b 
2 1 3 4 c 

df_result 
1 1 2 5 b 

到目前爲止,我已經能夠基本減少這樣的:

import pandas as pd 

df = pd.DataFrame({'A': [1,1,1], 
        'B': [2,2,3], 
        'C': [4,5,4], 
        'D': ['a', 'b', 'c']}) 
df_A = df[df['A'] == 1] 
df_B = df_A[df_A['B'] == 2] 
df_C = df_B[df_B['C'] == 5] 

要這樣:

parameter = [['A', 1], 
      ['B', 2], 
      ['C', 5]] 

df_filtered = df 
for x, y in parameter: 
    df_filtered = df_filtered[df_filtered[x] == y] 

其產生相同的結果。但我想知道是否有另一種方式?也許沒有循環在一行?

+0

您可以在沒有使用的情況下將您的條件複製出來[df ['A'] == 1)&(df ['B'] == 2)&(df ['C'] == 5)]''一個循環 – EdChum

+0

但是如果我事先不知道我的列是如何調用的以及我希望它們具有哪些值? – fukiburi

+0

你是什麼意思?你必須在某個點上有一些想法來比較哪些列和值?您可以輕鬆構建條件 – EdChum

回答

1

你可以使用query()方法來過濾數據,並從參數構造過濾表達式像

In [288]: df.query(' and '.join(['{0}=={1}'.format(x[0], x[1]) for x in parameter])) 
Out[288]: 
    A B C D 
1 1 2 5 b 

詳細

In [296]: df 
Out[296]: 
    A B C D 
0 1 2 4 a 
1 1 2 5 b 
2 1 3 4 c 

In [297]: query = ' and '.join(['{0}=={1}'.format(x[0], x[1]) for x in parameter]) 

In [298]: query 
Out[298]: 'A==1 and B==2 and C==5' 

In [299]: df.query(query) 
Out[299]: 
    A B C D 
1 1 2 5 b 
+0

哇,謝謝!我不知道'查詢'。如果我想比較字符串而不是整數,我將如何更改代碼?如果將所有值更改爲字符串,則'df.query()'返回一個空的DataFrame ... – fukiburi

+0

啊,我知道了!用{'{0} == \「{1} \」''替換了'{0} == {1}''。 – fukiburi

0

只爲信息,如果其他人有興趣,我會做這個方式:

import numpy as np 
matched = np.all([df[vn] == vv for vn, vv in parameters], axis=0) 
df_filtered = df[matched] 

但我喜歡query功能更好,現在我已經看到了@John Galt。

+0

不過,感謝您的意見!我也會記住這個方法。未來可能有用。 – fukiburi