假设我有一个熊猫数据帧,例如:检查这组大熊猫组由符合一定的条件
id | name
1 foo
1 bar
2 foo
3 bar
我的目标是获得同时具有“富”和“酒吧”不同的id%
到目前为止,我试图df.groupby('id').name.nunique()
,我不想要一个独特的名称计数,我想专门搜索foo和bar。
有人可以帮我吗?
假设我有一个熊猫数据帧,例如:检查这组大熊猫组由符合一定的条件
id | name
1 foo
1 bar
2 foo
3 bar
我的目标是获得同时具有“富”和“酒吧”不同的id%
到目前为止,我试图df.groupby('id').name.nunique()
,我不想要一个独特的名称计数,我想专门搜索foo和bar。
有人可以帮我吗?
names_per_id = df.groupby('id')['name'].unique()
让你列表的系列,具有:
id
1 [foo, bar]
2 [foo]
3 [bar]
从那里我们可以得到既具有foo和栏的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
他re是一个通用的解决方案。只需用您选择的自定义列表替换['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()