在不包括当前行的两列之间使用pandas groupby除法创建一个新列

Posted

技术标签:

【中文标题】在不包括当前行的两列之间使用pandas groupby除法创建一个新列【英文标题】:create a new column with pandas groupby division between two columns excluding the current row 【发布时间】:2021-08-16 04:48:05 【问题描述】:

我想在不包括当前行的两列之间创建一个新列,其中包含 pandas groupby 划分。 样本数据集:

import pandas as pd
  
df = pd.DataFrame('Group':['A', 'A', 'A', 'B', 'B'],
                     'Col_1':[100, 200, 300, 400, 500],
                     'Col_2':[55, 66, 77, 88, 99])
Group Col_1 Col_2
A 100 55
A 200 66
A 300 77
B 400 88
B 500 99

我想创建一个名为“Div_excl”的新列

方法:对每个Group取Col_1和Col_2之和,然后按sum排除每个group内的当前行值,再做除法

| Group |Col_1 | Col_2  |                Div_exclud             |
|-------|------|--------|---------------------------------------|
|    A  | 100  |  55    |[(55+66+77)-55)] / [(100+200+300)-100)]|
|    A  | 200  |  66    |[(55+66+77)-66)] / [(100+200+300)-200)]|
|    A  | 300  |  77    |[(55+66+77)-77)] / [(100+200+300)-300)]|
|    B  | 400  |  88    |   [(88+99)-88)] / [(400+500)-400)]    |
|    B  | 500  |  99    |   [(88+99)-99)] / [(400+500)-500)]    |

我尝试了以下方法,但看起来不正确:

df.groupby('Group').apply(lambda x: (df['Col_2'].sum()-x)/(df['Col_1'].sum()-x))

【问题讨论】:

【参考方案1】:

试试transform

g = df.groupby('Group')
df['New'] = (g['Col_2'].transform('sum')-df.Col_2)/(g['Col_1'].transform('sum')-df.Col_1)
df
Out[339]: 
  Group  Col_1  Col_2       New
0     A    100     55  0.286000
1     A    200     66  0.330000
2     A    300     77  0.403333
3     B    400     88  0.198000
4     B    500     99  0.220000

【讨论】:

【参考方案2】:

这是您已经在使用的apply 替代方法:

df = (
    df.groupby('Group')
    .apply(
        lambda x: x.assign(
            Div_exclud=(x['Col_2'].sum()-x['Col_2'])/(x['Col_1'].sum()-x['Col_1']))
    )
    .reset_index(drop=True)
)

输出:

  Group  Col_1  Col_2  Div_exclud
0     A    100     55    0.286000
1     A    200     66    0.330000
2     A    300     77    0.403333
3     B    400     88    0.198000
4     B    500     99    0.220000

【讨论】:

以上是关于在不包括当前行的两列之间使用pandas groupby除法创建一个新列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 中连接包含列表(系列)的两列

python pandas dataframe:将函数返回元组分配给数据框的两列

Pandas:将依赖于第三列的相同数据框的两列相乘

如何从 Pandas 中的两列形成元组列

如何将所有行的两列总和为第三列

pandas使用dataframe中的两列时间对象数据列作差生成时间差数据列将时间差(timedelta对象)与特定时间长度进行比较