通过满足特定条件检查pandas组中的哪些组

时间:2017-06-19 15:24:47

标签: pandas

假设我有一个pandas数据帧,例如:

id | name

1    foo

1    bar

2    foo

3    bar

我的目标是获得同时拥有'foo'和'bar'

的不同ID的百分比

到目前为止,我已尝试df.groupby('id').name.nunique(),我不想要一个唯一名称,我想专门搜索foo和bar。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:2)

names_per_id = df.groupby('id')['name'].unique()

为您提供一系列列表,其中包含:

id
1    [foo, bar]
2         [foo]
3         [bar]
从那里我们可以获得具有foo和bar的id:

foo_and_bar = names_per_id.apply(lambda row: ('foo' in row) and ('bar' in row))

1     True
2    False
3    False

最后,计算你要求的百分比:

pct = foo_and_bar.mean()

0.33333333333333331

答案 1 :(得分:1)

这是一般解决方案。只需使用您选择的自定义列表替换[' foo',' bar']列表。

res = df.groupby('id')['name'].agg(lambda s: np.all(np.in1d(['foo', 'bar'], s)))

哪个输出:

     name
id       
1    True
2   False
3   False

然后只取这个系列的意思

res.mean()

输出

name    0.333333
dtype: float64

将它全部放在熊猫中:

df.groupby('id')['name'].agg(lambda s: pd.Series(['foo', 'bar']).isin(s).all()).mean()