python - 是否有一种更简洁的方法可以将需要多个数据框列的函数应用于分组数据?
问题描述
假设我有一个函数“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
解决方案
如果我要创建一个新列,我想在同一行上传递列的值,我总是使用 apply 调用一个函数。在你的情况下,你可以做到
def f(row):
return row["a"]**2 + row["b"]**3 - 50
my_df['new_col'] = my_df.apply(f, axis=1 )
你会得到相同的结果
推荐阅读
- python - python Numppy数组获取最后3个值以识别其升序或降序或顺序
- ajax - 使用 index.html 时,由于 .htaccess 配置错误,JQuery ajax 抛出 403 禁止错误
- swift - 使用 CKQuery 列表获取结果
- wordpress - 我有 nginx 文件,而不是 wordpress 页面。如何解决?
- html - 如何修复 tailwindcss-cli 抛出 TypeError: Object.fromEntries is not a function?
- bash - 如何重命名文件并从一个 s3 存储桶移动到另一个
- c - getchar() 在将字符存储在结构变量的成员中时不会自行执行
- xcode - Xcode 警告我“malloc”的隐式声明,但 stdlib.h 包含在标头中
- python - 使用python链接图像中的破损边缘
- flutter - Dart Isolate 作为永久工人