熊猫过滤器的计数值包含多个答案

时间:2019-06-11 23:18:10

标签: 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

在这种情况下,我想进行过滤以仅查看max。例如。我想要这样:

enter image description here

1 个答案:

答案 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