Python Pandas GroupBy%计算

时间:2017-01-19 06:27:13

标签: python pandas dataframe

我有一个包含2列的数据框。我试图计算ID中记录数量的TypeB百分比,如下所示:

公式:( TypeB的计数)/(组中的记录数)* 100

Result :
001 = (2/3) * 100 => 66.66
002 = (0/2) * 100 => 0
003 = (1/1) * 100 => 100

数据帧

ID   Type
001  TypeA
001  TypeB
001  TypeB
002  TypeA
002  TypeA
003  TypeB

所以,我已经能够分组了

byID = df.groupby('ID')

我正在阅读熊猫的交叉表,但似乎无法弄清楚如何处理解决方案

2 个答案:

答案 0 :(得分:2)

您可以先使用groupby size来计算群组的计数长度,然后按unstack重新整理NaN 0,然后将列{{{ 1}} sum,最后一个乘以TypeB

100

对于重塑,可以使用crosstab,但在较大的数据帧中它有点慢:

df = df.groupby(['ID','Type']).size().unstack(fill_value=0)
print (df)
Type  TypeA  TypeB
ID                
1         1      2
2         2      0
3         0      1

df1 = df.TypeB.div(df.sum(axis=1)).mul(100).reset_index(name='percentage')
print (df1)
   ID  percentage
0   1   66.666667
1   2    0.000000
2   3  100.000000

编辑:

您可以使用map添加新列:

df = pd.crosstab(df.ID,df.Type)
print (df)
Type  TypeA  TypeB
ID                
1         1      2
2         2      0
3         0      1

答案 1 :(得分:1)

groupbyvalue_counts(normalize=True)一起使用 normalize会自动将计数除以总计。

df.groupby('ID').Type.value_counts(normalize=True).unstack(fill_value=0).TypeB

ID
001    0.666667
002    0.000000
003    1.000000
Name: TypeB, dtype: float64