我需要用一个dict来过滤一个数据框,这个dict的key是列名,value是我想要过滤的值:
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]
但是这将过滤数据框几次,一次一个值,并且不能同时应用所有的过滤器。2有没有一种方法可以通过编程来实现呢?
EDIT:示例:
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
则应当仅选择最后一个。
9条答案
按热度按时间e1xvtsh31#
IIUC,你应该可以做这样的事情:
其工作原理是创建一个系列进行比较:
选择
df1
的相应部分:查找它们的匹配位置:
查找它们 * 全部 * 匹配的位置:
最后用这个来索引df1:
3lxsmp7m2#
上述内容的抽象,用于传递过滤器值数组而不是单个值的情况(类似于panda.core.series.series.isin())。使用相同的示例:
hjzp0vay3#
下面是一个方法:
更新日期:
如果各列的值相同,则可以执行以下操作:
其结果为:
如果这是您经常做的事情,您可以尽可能地修补DataFrame以方便访问此过滤器:
然后像这样使用这个过滤器:
也会产生同样的结果。
但是,这显然不是正确的方法。我会使用DSM的方法。
xpszyzbs4#
对于python 2,@primer的答案是可以的,但是在Python3中要小心,因为有dict_keys。
Python3的正确方法:
flseospp5#
这里有另一种方法:
这给出:
byqmnocz6#
您还可以创建查询
yuvru6vn7#
要跟进DSM的答案,还可以使用
any()
将查询转换为OR操作(而不是AND):df1.loc[(df1[list(filter_v)] == pd.Series(filter_v)).any(axis=1)]
bxjv4tth8#
结合前面的答案,这里有一个函数可以提供给
df1.loc
。它允许AND/OR(使用how='all'
/'any'
),如果需要,它还允许使用op
关键字进行==
以外的比较。brc7rcf09#
我遇到了一个问题,因为我的字典有多个值的同一个关键字。
我可以将DSM的查询更改为: