如何应用一个函数,该函数将两个参数作为熊猫的列接收?



在熊猫中,我知道函数可以按如下方式应用:

df.apply(f, axis=1)

但是,我有一个接收两个参数的函数,例如:

def a_sum(x,y):
return x+y

如何通过将ColAColB的元素作为参数来应用上述函数:

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
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

apply方法与axis=1一起使用时,您将一行也是 Series 传递给函数,要在此处应用自定义f,您可以使用 lambda 函数包装它,该函数获取行,然后将ColAColB作为参数传递给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
df['ColF'] =  df.apply(lambda x: a_sum(x['ColA'], x['ColB']), axis=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'])]

最新更新