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

发布于 2021-01-29 19:34:30

我需要使用字典来过滤数据帧,该字典的键是列名,值是我要过滤的值:

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

仅应选择最后一个。

关注者
0
被浏览
65
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看