python - 按允许的列值组合列表过滤 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])]
我只是不知道如何结合这两个概念。
解决方案
这是 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
推荐阅读
- python - 如何使用另一个列表中的元素初始化新列表
- javascript - 如何在 then() 方法中发送响应,然后是另一个 then() 方法?
- python - 为什么 collections.Counter 或 .count() 在这里没有给出正确答案?
- java - 如何使用 java 运行 UFT 脚本
- ios - 如何检索评论/帖子的键
- r - 使用 ifelse 函数重命名百分比值
- html - 在不更改渲染输出的情况下,哪些 HTML 空白可以安全地丢弃或添加?
- node.js - babel-jest 找不到 https
- c# - C# MS Teams Bot 无法使用日期输入呈现
- python - 使用带有 SOCKS 代理的 Paramiko 连接到 SSH 服务器