使用字典中的值过滤熊猫数据框

新手上路,请多包涵

我需要使用 dict 过滤数据框,该字典以键为列名,值为要过滤的值构造:

 filter_v = {'A':1, 'B':0, 'C':'This is right'}
# this would be the normal approach
df[(df['A'] == 1) & (df['B'] ==0)& (df['C'] == 'This is right')]

但我想在线上做点什么

for column, value in filter_v.items():
    df[df[column] == value]

但这会多次过滤数据框,一次过滤一个值,而不是同时应用所有过滤器。有没有办法以编程方式进行?

编辑:一个例子:

 df1 = pd.DataFrame({'A':[1,0,1,1, np.nan], 'B':[1,1,1,0,1], 'C':['right','right','wrong','right', 'right'],'D':[1,2,2,3,4]})
filter_v = {'A':1, 'B':0, 'C':'right'}
df1.loc[df1[filter_v.keys()].isin(filter_v.values()).all(axis=1), :]

    A   B   C   D
0   1   1   right   1
1   0   1   right   2
3   1   0   right   3

但预期的结果是

    A   B   C   D
3   1   0   right   3

只应选择最后一个。

原文由 Ivan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 296
2 个回答

IIUC,你应该能够做这样的事情:

 >>> df1.loc[(df1[list(filter_v)] == pd.Series(filter_v)).all(axis=1)]
   A  B      C  D
3  1  0  right  3


这是通过制作一个系列来比较的:

 >>> pd.Series(filter_v)
A        1
B        0
C    right
dtype: object

选择 df1 的对应部分:

 >>> df1[list(filter_v)]
    A      C  B
0   1  right  1
1   0  right  1
2   1  wrong  1
3   1  right  0
4 NaN  right  1

找到它们匹配的地方:

 >>> df1[list(filter_v)] == pd.Series(filter_v)
       A      B      C
0   True  False   True
1  False  False   True
2   True  False  False
3   True   True   True
4  False  False   True

找到它们 匹配的地方:

 >>> (df1[list(filter_v)] == pd.Series(filter_v)).all(axis=1)
0    False
1    False
2    False
3     True
4    False
dtype: bool

最后使用它来索引 df1:

 >>> df1.loc[(df1[list(filter_v)] == pd.Series(filter_v)).all(axis=1)]
   A  B      C  D
3  1  0  right  3

原文由 DSM 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于传递过滤器值数组而不是单个值(类似于 pandas.core.series.Series.isin())的情况,以上的抽象。使用相同的例子:

 df1 = pd.DataFrame({'A':[1,0,1,1, np.nan], 'B':[1,1,1,0,1], 'C':['right','right','wrong','right', 'right'],'D':[1,2,2,3,4]})
filter_v = {'A':[1], 'B':[1,0], 'C':['right']}
##Start with array of all True
ind = [True] * len(df1)

##Loop through filters, updating index
for col, vals in filter_v.items():
    ind = ind & (df1[col].isin(vals))

##Return filtered dataframe
df1[ind]

##Returns

    A   B    C      D
0   1.0 1   right   1
3   1.0 0   right   3

原文由 Ben Saunders 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题