假设我有一个类似的数据框:
import pandas as pd
df = pd.DataFrame({'ID': ['3a2b', '2a2b', '1a2b', '1a2b'],
'label': [2, 2, 1, 0]})
df visualized:
ID label
3a2b 2
2a2b 2
1a2b 1
1a2b 0
现在我想分组ID并显示与该ID相关联的标签的百分比是每个[0,1,2]
所需的输出可视化:
ID label 0 label 1 label 2
1a2b 50% 50% 0%
2a2b 0% 0% 100%
3a2b 0% 0% 100%
我试过了:
df.groupby(['ID']).agg({'label': 'sum'})
但它不太有用。
每列的分母可以使用:
找到df1 = df.groupby(['ID']).agg({'label': 'count'})
输出:
ID . label
1a2b . 2
2a2b . 1
3a2b . 1
非常感谢任何帮助!
答案 0 :(得分:0)
在get_dummies
上使用label
,在ID
上使用groupby,然后在sum
上使用,并应用行式百分比计算。
In [48]: (pd.get_dummies(df['label'], prefix='label')
.groupby(df['ID'])
.sum()
.apply(lambda x: x / x.sum() * 100, axis=1)
)
Out[48]:
label_0 label_1 label_2
ID
1a2b 50.0 50.0 0.0
2a2b 0.0 0.0 100.0
3a2b 0.0 0.0 100.0
详细
In [49]: pd.get_dummies(df['label'], prefix='label')
Out[49]:
label_0 label_1 label_2
0 0.0 0.0 1.0
1 0.0 0.0 1.0
2 0.0 1.0 0.0
3 1.0 0.0 0.0
In [50]: pd.get_dummies(df['label'], prefix='label').groupby(df['ID']).sum()
Out[50]:
label_0 label_1 label_2
ID
1a2b 1.0 1.0 0.0
2a2b 0.0 0.0 1.0
3a2b 0.0 0.0 1.0
答案 1 :(得分:0)
按ID分组,选择'标签',计算不同的值:
x = df.groupby(['ID'])['label'].value_counts()
归一化并转换为"宽"表:
(x / x.groupby(level=0).sum()).unstack().fillna(0) * 100
#label 0 1 2
#ID
#1a2b 50.0 50.0 0.0
#2a2b 0.0 0.0 100.0
#3a2b 0.0 0.0 100.0