假设我有一个DataFrame,其中有很多列df
,以及可以应用于这些列以计算不同结果的不同函数fn(...)
。因此,列名适合函数的参数:
import pandas as pd
def f1(A, C):
return(A + C)
def f2(B, C):
return(C - B)
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns = ['A','B','C'])
字符串
要将函数应用到每行,我可以使用下面的代码行:
df['result'] = df.apply(lambda row: f1(row['A'], row['C']), axis = 'columns')
型
然而,由于不同的函数采用不同的输入参数,显式地指定它们有点烦人,所以我正在寻找一种方法,以便apply
根据列名识别传递给函数的值。在R中,上面的行要短得多,我发现这非常方便:
df$result = pmap(df, f1)
型
Python中有类似的东西吗?
顺便说一句,我知道不推荐使用apply
,但是这些函数太复杂了,无论如何都不能进行vertorizable(至少对我来说是这样),上面的函数定义使调试变得容易得多。
3条答案
按热度按时间nhjlsmyf1#
我可能忽略了一些更简单的方法,但是如果你的目标是能够在
apply
大小上简单地将一行传递给函数,并且在函数代码大小上使用参数name,那么一种方法可能是使用装饰器。我的意思是,假设你不能把你的函数写成以行作为参数
手动(不带装饰器)方式
字符串
你可以用这个装饰器来帮助创建
型
然后,您可以使用这些函数,并将行作为参数传递。因为这是创建一个函数
f1(row)
,其结果是您所期望的型
当然你可以按预期使用它
型
Edit:使用内省的简化
使用这个依赖于内省的装饰器,您甚至可以跳过参数名的传递,而直接依赖于给参数的名称
型
然后你可以定义你的函数
型
该函数实际上是一个期望一行作为参数的函数,并且期望在该行中找到字段D和F。
因此,
型
所以,你可以像以前一样,把它传给Pandas。
tl;dr
从代码中总结
型
结果:
型
kadbb4592#
在chrslg's answer之后,我认为最简单的方法是解压缩
row
并重写f1
,以便将未使用的参数传递给**kwargs
:字符串
svmlkihl3#
您可以在一个函数下一起执行它们,并在那里调用正确的列,然后使用
result_type = 'expand'
将输出拆分为多个列:字符串