我有一个包含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')
我正在阅读熊猫的交叉表,但似乎无法弄清楚如何处理解决方案
答案 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)
将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