在pandas中,我知道可以按如下方式应用函数:
df.apply(f, axis=1)
但是,我有一个接收两个参数的函数,例如让我们说:
def a_sum(x,y):
return x+y
如何通过将ColA
和ColB
的元素作为参数来应用上述函数:
ColA ColB ColC ColD
1 2 True False
1 1 True False
1 4 True False
...
1 10 True False
为了生成这个新列ColF
:
ColA ColB ColC ColD ColF
1 2 True False 3
1 1 True False 2
1 4 True False 5
...
1 10 True False 11
答案 0 :(得分:4)
from itertools import starmap
df.assign(F=list(starmap(a_sum, df[['ColA', 'ColB']].values)))
ColA ColB ColC ColD F
0 1 2 True False 3
1 1 1 True False 2
2 1 4 True False 5
3 1 10 True False 11
<强>时序强>
使用大数据
df = pd.concat([df] * 1000, ignore_index=True)
%timeit df.assign(F=list(starmap(a_sum, df[['ColA', 'ColB']].values)))
%timeit df.assign(F=df.apply(lambda row: a_sum(row.ColA, row.ColB), axis=1))
100 loops, best of 3: 5.01 ms per loop
10 loops, best of 3: 90.7 ms per loop
答案 1 :(得分:2)
当使用apply
方法与axis=1
一起使用时,你也将一个也是系列的行传递给函数,要在这里应用自定义f
,你可以用lambda函数包装它获取行,然后将ColA
和ColB
作为参数传递给f
。
df.apply(lambda row: f(row.ColA, row.ColB), axis=1)
df['ColE'] = df.apply(lambda row: a_sum(row.ColA, row.ColB), axis=1)
df
#ColA ColB ColC ColD ColE
#0 1 2 True False 3
#1 1 1 True False 2
#2 1 4 True False 5
#3 1 10 True False 11
答案 2 :(得分:2)
df['ColF'] = df.apply(lambda x: a_sum(x['ColA'], x['ColB']), axis=1)
答案 3 :(得分:1)
还可以使用
df['ColF'] = [a+b for a,b in zip(df['ColA'],df['ColB'])]
或者如果您的真实功能更加自定义
df['ColF'] = [a_sum(a,b) for a,b in zip(df['ColA'],df['ColB'])]