2017-06-19 30 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()