首页 > 解决方案 > 按允许的列值组合列表过滤 df

问题描述

假设我有一个这样的数据框:

   Animal  Color
0     Dog  White
1     Cat  Black
2     Dog  Black
3     Dog  Brown
4  Rabbit  Brown

我想获得与这些元组匹配的所有索引:[('Cat', 'Black'), ('Dog', 'Brown')]. 所以[1,3]在这种情况下就是这样。

我不能做这样的事情,df[np.isin(df['Animal'], ['Cat', 'Dog']) & np.isin(df['Color'], ['Black', 'Brown'])]因为那会给我[1,2,3]

如果这只是一列,我会使用df[np.isin(df[col], ls)].

如果我只关心一个元组,我可以做到df[(df[col0] == tup[0]) & (df[col1] == tup[1])]

我只是不知道如何结合这两个概念。

标签: pythonpandas

解决方案


这是 pandas MultiIndex 的一种方法。我将示例更改为有一条红狗:

from io import StringIO
import pandas as pd

data = '''   Animal  Color
0     Dog  White
1     Cat  Black
2     Dog  Red
3     Dog  Brown
4  Rabbit  Brown
'''
df = pd.read_csv(StringIO(data), sep='\s+', engine='python', index_col=0)

to_keep = [('Cat', 'Black'), 
           ('Dog', 'Red'),
          ]

mask = pd.MultiIndex.from_frame(df[['Animal', 'Color']]).isin(to_keep)

print(df.loc[mask])

  Animal  Color
1    Cat  Black
2    Dog    Red

推荐阅读