Skip to main content
 首页 » 编程设计

python之Groupby 并使用自定义函数执行逐行计算

2025年05月04日15lhb25

从这个问题开始:python - Group by and add new row which is calculation of other rows

我有一个 Pandas 数据框如下:

col_1   col_2   col_3  col_4 
a       X        5      1 
a       Y        3      2 
a       Z        6      4 
b       X        7      8 
b       Y        4      3 
b       Z        6      5 

我想为 col_1 中的每个值应用一个函数,其中 col_3 和 col_4(以及更多列)中的值对应于 col_2 中的 X 和 Z,并使用这些值创建一个新行。所以输出如下:

col_1   col_2   col_3  col_4  
a       X        5      1 
a       Y        3      2 
a       Z        6      4 
a       NEW      *      * 
b       X        7      8 
b       Y        4      3 
b       Z        6      5 
b       NEW      *      * 

其中 * 是函数的输出。

原始问题(只需要简单添加)的回答是:

new = df[df.col_2.isin(['X', 'Z'])]\ 
  .groupby(['col_1'], as_index=False).sum()\ 
  .assign(col_2='NEW') 
 
df = pd.concat([df, new]).sort_values('col_1') 

我现在正在寻找一种使用自定义函数的方法,例如 (X/Y) 或 ((X+Y)*2),而不是比 X+Y。如何修改此代码以满足我的新要求?

请您参考如下方法:

我不确定这是否是您要找的,但这里是:

def f(x): 
    y = x.values 
    return y[0] / y[1] # replace with your function 

而且,new 的变化是:

new = ( 
    df[df.col_2.isin(['X', 'Z'])] 
      .groupby(['col_1'], as_index=False)[['col_3', 'col_4']] 
      .agg(f) 
      .assign(col_2='NEW') 
) 
 
  col_1     col_3  col_4 col_2 
0     a  0.833333   0.25   NEW 
1     b  1.166667   1.60   NEW 
 
df = pd.concat([df, new]).sort_values('col_1') 
 
df 
  col_1 col_2     col_3  col_4 
0     a     X  5.000000   1.00 
1     a     Y  3.000000   2.00 
2     a     Z  6.000000   4.00 
0     a   NEW  0.833333   0.25 
3     b     X  7.000000   8.00 
4     b     Y  4.000000   3.00 
5     b     Z  6.000000   5.00 
1     b   NEW  1.166667   1.60 

我对 f 抱有信心,并假设这些列在调用函数之前已排序。如果不是这种情况,则需要额外的 sort_values 调用:

df = df.sort_values(['col_1, 'col_2']) 

应该可以解决问题。