我有一个pandas DataFrame,如下所示:
pd.DataFrame({'ID': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'}, 'Count': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 'Group': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B'}})
看起来像这样:
Change Count Group
0 A 1 A
1 B 2 A
2 C 3 A
3 D 4 B
4 E 5 B
我想按Group
列分组,找到该子集的Count
列中所有计数的总和,然后创建一个新列Proportion
,该列计算为该子集的Count
列中的值除以该子集的总和。
结果应该如下所示:
pd.DataFrame({'Change': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'}, 'Count': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 'Group': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B'}, 'Proportion': {0: 0.167, 1: 0.333, 2: 0.5, 3: 0.444, 4: 0.555}})
和
Change Count Group Proportion
0 A 1 A 0.167
1 B 2 A 0.333
2 C 3 A 0.500
3 D 4 B 0.444
4 E 5 B 0.555
让我们用transform
试试groupby
df['new'] = df['Count'].div(df.groupby('Group')['Count'].transform('sum'))
df
Out[176]:
Change Count Group new
0 A 1 A 0.166667
1 B 2 A 0.333333
2 C 3 A 0.500000
3 D 4 B 0.444444
4 E 5 B 0.555556
我将遵循以下步骤:
- 获取组总数:
groups = df[['Group', 'Count']].groupby('Group').sum().reset_index()
- 将df与组合并,使每一行都有组总数:
df = pd.merge(df, groups, on='Group')
计算比例:df['Proportion'] = df['Count'] / df['sum']