繁体   English   中英

Python Pandas Group按%计算

[英]Python Pandas GroupBy % calculation

我有2列的数据框。 我正在尝试计算ID中的记录数中TypeB的百分比,如下所示:

公式:(类型B的计数)/(组中的记录数)* 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')

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

您可以先使用具有size groupby来计算组的长度,然后通过对unstack ,将NaN填充为0 ,然后将TypeB列除以sum ,最后乘以100

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

要进行重塑,可以使用crosstab ,但是在较大的数据框中它会慢一些:

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

编辑:

您可以使用map添加新列:

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

df2 = df1.TypeB.div(df1.sum(axis=1)).mul(100)
print (df2)
ID
1     66.666667
2      0.000000
3    100.000000
dtype: float64

df['percentage'] = df.ID.map(df2)
print (df)
   ID   Type  percentage
0   1  TypeA   66.666667
1   1  TypeB   66.666667
2   1  TypeB   66.666667
3   2  TypeA    0.000000
4   2  TypeA    0.000000
5   3  TypeB  100.000000

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM