说我有这个数据框:
df = pd.DataFrame([
('max', 'park', True),
('max', 'home', False),
('max', 'somewhere', True),
('spot', 'home', False),
('spot', 'park', False),
('bell', 'home', True),
('bell', 'park', True),
], columns='name,location,seen'.split(','))
df
我如何找到在一个地方见过的所有人,而不是另一个地方?解决此问题的另一种方法是如何过滤给定索引中具有多个值的MultiIndex系列。
df.groupby('name').seen.value_counts()
name seen
bell True 2
max True 2
False 1
spot False 2
Name: seen, dtype: int64
在这种情况下,我想进行过滤以仅查看max。例如。我想要这样:
答案 0 :(得分:4)
编辑:@unutbu在评论中提供了两种优雅的解决方案:
# Option 1: groupby.transform
df.loc[df.groupby(['name'])['seen'].transform('nunique') > 1]
# Option 2: groupby.filter
df.groupby(['name']).filter(lambda x: x['seen'].nunique() > 1)
[后接老答案]
这是一种使用布尔掩码选择具有两个唯一seen
值的名称的方法:
mask = df.groupby('name').seen.nunique().eq(2)
names = mask[mask].index
df[df['name'].isin(names)]
name location seen
0 max park True
1 max home False
2 max somewhere True