2017-06-19 63 views
0

假设我有一个熊猫数据帧,例如:检查这组大熊猫组由符合一定的条件

id | name 

1 foo 

1 bar 

2 foo 

3 bar 

我的目标是获得同时具有“富”和“酒吧”不同的id%

到目前为止,我试图df.groupby('id').name.nunique(),我不想要一个独特的名称计数,我想专门搜索foo和bar。

有人可以帮我吗?

回答

2
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 
1

他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()