[英]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
将groupby
与value_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.