python - 使用字典中的值过滤 Pandas 数据框

标签 python pandas

我需要用一个字典来过滤一个数据框,键是列名,值是我要过滤的值:

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[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

关于python - 使用字典中的值过滤 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34157811/

相关文章:

Python 压缩运行长度编码

python - 如何摆脱 Pandas/Matplotlib 条形图 x 轴上的虚线?

python - 如何将多列中的特定值替换为另一个数据帧的相应值?

python - 如何在 pandas 数据框中使用 bool 索引来表示子字符串关系?

python - 如何有效地重新排列 Pandas 数据如下?

Python - urllib2 & cookielib

python - 使用 numpy.fromfile 读取 RAW 图像 (.CR2)

python - 将包含字符串和 NAN 的列转换为 Pandas 中的整数列表

python - 使用 python file_dialog() 从 Scientific Linux 访问 Windows 共享上的网络文件夹

python - django-nose collect-only 运行测试