首页 > 解决方案 > 是否有一种更简洁的方法可以将需要多个数据框列的函数应用于分组数据?

问题描述

假设我有一个函数“f”,它需要三个参数:一个数据框和两列。

如果我想对分组数据使用“func”来创建一个新列。这是一个设置:

 import pandas as pd

 def f(x,y,z):
    return sum(x[y]**2) + sum(x[z]**3) - 50

 my_df = pd.DataFrame({'state':['Alabama','Alaska','Arizona','Alaska'],'a':[1,2,3,4],'b':[4,5,6,7]})

我尝试应用的实际功能要复杂得多,但这个例子应该可以。我一直在这样做:

x = my_df.groupby('state').apply(f,'a','b').rename('new_col')

my_df = my_df.merge(x, on = 'state', how = 'left')

通常我只会使用转换,但转换会引发错误,因为它一次只能用于一列。

my_df.groupby('state').transform(f,'a','b') 

KeyError: ('a', 'occurred at index a')

有没有更清洁的方法来做到这一点?我真的希望有一种方法可以使用 apply 并获得长度等于原始(未分组)数据帧的转换结果。

期望的结果:

     state  a  b  new_col
0  Alabama  1  4       15
1   Alaska  2  5      438
2  Arizona  3  6      175
3   Alaska  4  7      438

标签: pythonpandaspandas-groupbyapply

解决方案


如果我要创建一个新列,我想在同一行上传递列的值,我总是使用 apply 调用一个函数。在你的情况下,你可以做到

def f(row):
    return row["a"]**2 + row["b"]**3 - 50

my_df['new_col'] = my_df.apply(f, axis=1 )

你会得到相同的结果


推荐阅读