熊猫 - 按ID分组,获得百分比

时间:2017-04-30 06:21:19

标签: python python-2.7 pandas

假设我有一个类似的数据框:

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

非常感谢任何帮助!

2 个答案:

答案 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