根据分组创建 pandas 列
Posted
技术标签:
【中文标题】根据分组创建 pandas 列【英文标题】:Create a pandas column based on grouping 【发布时间】:2022-01-08 11:23:37 【问题描述】:我有一个这样的数据框:
Group Col A Col B
1 A1 B1
1 A2 B2
2 A3 B3
2 A4 B4
我想创建一个关于组的新列 Per A 和 Per B,所以结果应该是
Group Col A Col B Per A Per B
1 A1 B1 100*A1/(A1+A2) 100*B1/(B1+B2)
1 A2 B2 100*A2/(A1+A2) 100*B2/(B1+B2)
2 A3 B3 100*A3/(A3+A4) 100*B3/(B3+B4)
2 A4 B4 100*A4/(A3+A4) 100*B4/(B3+B4)
我需要一个一般情况,有几个组,每个组都有不同的组大小。
我尝试使用 for 循环,虽然我能够找到列,但我无法将它们分配给数据框。我不明白究竟是什么阻止了它。
例如,这是我要寻找的结果(注意我如何更改反映“不同组大小”的组列)
Group Col A Col B Per A Per B
1 1 2 100.0 100.0
2 1 2 16.67 25.00
2 2 2 33.33 25.00
2 3 4 50.00 50.00
【问题讨论】:
请提供实际数据,以及预期的输出数据框 【参考方案1】:试试groupby
transform
和update
df.update(df.div(df.groupby('Group').transform('sum'))*100)
df
Out[478]:
Group ColA ColB
0 1 33.333333 31.250000
1 1 66.666667 68.750000
2 2 42.857143 42.857143
3 2 57.142857 57.142857
4 3 27.777778 27.777778
5 3 33.333333 33.333333
6 3 38.888889 38.888889
【讨论】:
所有答案似乎都是先产生百分比,然后再添加列。我想没有办法更新当前的数据框。【参考方案2】:Groupby 组然后求和。这为您提供了每组的总和。
将组设置为索引,然后除以上面的结果。 index 可以只划分相似的索引词。代码如下
df.set_index('group').div(df.groupby('group').sum())*100
【讨论】:
【参考方案3】: df = pd.DataFrame(
'Group': [1,1,2,2,3,3,3],
'ColA': [1,2,3,4,5,6,7],
'ColB': [10,22,30,40,50,60,70],
)
df = df.merge(df.groupby(['Group'])['ColA', 'ColB'].sum().reset_index(),
left_on='Group', right_on='Group')
df['PerA'] = df['ColA_x']*100/df['ColA_y']
df['PerB'] = df['ColB_x']*100/df['ColB_y']
df = df.rename(
columns='ColA_x': 'ColA', 'ColB_x': 'ColB').drop(
columns=['ColA_y', 'ColB_y'])
print (df)
输出:
Group ColA ColB PerA PerB
0 1 1 10 33.333333 31.250000
1 1 2 22 66.666667 68.750000
2 2 3 30 42.857143 42.857143
3 2 4 40 57.142857 57.142857
4 3 5 50 27.777778 27.777778
5 3 6 60 33.333333 33.333333
6 3 7 70 38.888889 38.888889
【讨论】:
似乎需要先找到百分比,然后更新我的数据框。我可以使用分组和除法找到百分比,但尝试更新数据框失败。此外,我的数据框有几个组和几个列 A、B、....,这使得这个解决方案令人不快。然而,这与我最初尝试做的类似。以上是关于根据分组创建 pandas 列的主要内容,如果未能解决你的问题,请参考以下文章