我需要使用字典来过滤数据帧,该字典的键是列名,值是我要过滤的值:
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
仅应选择最后一个。
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
>>> 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: