【问题标题】:Create a pandas column based on grouping根据分组创建 pandas 列
【发布时间】: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

【问题讨论】:

  • 请提供实际数据,以及预期的输出数据框

标签: python pandas dataframe group-by


【解决方案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、....,这使得这个解决方案令人不快。然而,这与我最初尝试做的类似。
    猜你喜欢
    • 2023-02-02
    • 2017-10-22
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多