Python使用lambda将pd.DataFrame应用于嵌套循环是否可行?
我试图通过使用lambda apply创建一个新列来避免python中的嵌套循环 使用以下参数:Python使用lambda将pd.DataFrame应用于嵌套循环是否可行?,python,performance,nested,pandas,Python,Performance,Nested,Pandas,我试图通过使用lambda apply创建一个新列来避免python中的嵌套循环 使用以下参数: from pandas import * import pandas as pd df = pd.DataFrame((np.random.rand(100, 4)*100), columns=list('ABCD')) df['C'] = df.apply(lambda A,B: A+B) TypeError:(“()正好接受2个参数(给定1个)”,u'出现在索引A') 显然,这不起作用
from pandas import *
import pandas as pd
df = pd.DataFrame((np.random.rand(100, 4)*100), columns=list('ABCD'))
df['C'] = df.apply(lambda A,B: A+B)
TypeError:(“()正好接受2个参数(给定1个)”,u'出现在索引A')
显然,这不起作用,有什么建议吗 是否要添加列
A
和列B
,并将结果存储在C
中?然后你可以让它更简单:
df.C = df.A + df.B
正如@EdChum在注释中指出的那样,
apply
中函数的参数是一个系列,默认情况下位于轴0
上,该轴是行(轴1
表示列):
在这里,我们添加第一行和第二行:
>>> df.apply(lambda s: s[0] + s[1])
A 143.425475
B 125.411981
C 111.561680
D 120.786886
dtype: float64
要处理列,请使用axis=1
关键字参数:
>>> df.apply(lambda s: s[0] + s[1], axis=1)
0 130.235156
1 138.602299
2 26.991364
3 143.229523
...
98 152.640811
99 90.266934
产生与按名称引用列相同的结果:
>>> (df.apply(lambda s: s[0] + s[1], axis=1) ==
df.apply(lambda s: s['A'] + s['B'], axis=1))
0 True
1 True
2 True
3 True
...
98 True
99 True
默认情况下,应用程序无法按列运行,而且您误解了lambda参数实际表示的内容,因此lambda func无法按预期映射到列。如果你想让它按行运行,你需要像这样做
df['c']=df.apply(lambda row:row.A+row.B,axis=1)
但是@miku的答案会达到你想要的效果,并且是正确的simpler@EdChum,df.apply(lambda s:s.A+s.C,axis=1)
生成一个AttributeError:(“'Series'对象没有属性'A'”在0.12中,u'出现在指数0')
;但是,df.apply(lambda s:s['A']+s['C'],axis=1)
起作用。@miku没有意识到这一点,看起来像是一个在0.12中修复的错误,我个人总是使用[]
,因为它对我来说更容易理解。谢谢你指出这一点,你说对了。谢谢:)
>>> (df.apply(lambda s: s[0] + s[1], axis=1) ==
df.apply(lambda s: s['A'] + s['B'], axis=1))
0 True
1 True
2 True
3 True
...
98 True
99 True