在Python数据框中迭代地过滤数据

时间:2016-03-07 15:08:35

标签: python-3.x pandas

我想知道现有的大熊猫功能,到目前为止我可能无法找到。

基本上,我有一个包含各种列的数据框。我想根据某些列的值选择特定的行(仅供参考:我对D列的值感兴趣,其中有几个参数在A-C中描述)。

E.g。我想知道哪一行有A == 1& B == 2& Ç== 5?

shouldAutorotate/supportedInterfaceOrientations/preferredInterfaceOrientationForPresentation

到目前为止,我基本上已经能够减少这个:

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]

产生了相同的结果。但我想知道是否还有另一种方式?也许在一行中没有循环?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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了。