根据分组创建 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 transformupdate

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 列的主要内容,如果未能解决你的问题,请参考以下文章

如何根据某些分组列取消pandas数据框? [复制]

使用 Python pandas 根据列增量对相同的值进行分组

pandas数据分组

pandas 根据先前的值创建组

Python pandas数据框根据条件分组

使用 Python pandas 根据列值生成每个组的百分比