假设我有一个pandas数据帧,例如:
id | name
1 foo
1 bar
2 foo
3 bar
我的目标是获得同时拥有'foo'和'bar'
的不同ID的百分比到目前为止,我已尝试df.groupby('id').name.nunique()
,我不想要一个唯一名称,我想专门搜索foo和bar。
有人能帮助我吗?
答案 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()