假設我有一個熊貓數據幀,例如:檢查這組大熊貓組由符合一定的條件
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()