如何应用一个函数接收两个参数作为与熊猫列?
在熊猫我知道如下的功能可应用于:如何应用一个函数接收两个参数作为与熊猫列?
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
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
哪个更有效率? –
在小数据,相同。在大数据...'starmap' – piRSquared
虽然这个工作,我得到了:'TypeError:不支持的操作数类型(S)为 - :'str'和'int'' ...任何想法如何解决它? –
当使用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
虽然这个工作,我得到了:'TypeError:不支持的操作数类型的 - :'str'和'int'' ...任何想法如何解决它? –
检查ColA和ColB的数据类型。确保他们是你所期望的。 'df [['ColA','ColB']]。dtypes'。 – Psidom
是的,我试图用'int()'来施放它。但是,我得到:'ValueError:int()以10为底的无效文字:17087,17098' –
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'])]
这是一个典型的例子吗?因为总结2列的速度更快。 –
是的,它实际上是一样的......问题是,一列是一个字符串,但大熊猫似乎把它作为一个浮点数,虽然我把它投入到一个int –
这是你想要的吗? 'df.iloc [:,:2] .astype(int).sum(axis = 1)' –