首页 > 解决方案 > pandas 过滤值计数有多个答案

问题描述

假设我有这个数据框:

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

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

在这种情况下,我想过滤以查看最大值。例如,我想要这样:

在此处输入图像描述

标签: pandas

解决方案


编辑:@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

推荐阅读