我正在尝试创建一个逐行迭代pandas数据帧的函数。我想基于其他列的行值创建一个新列。我的原始数据框可能如下所示:
df:
A B
0 1 2
1 3 4
2 2 2
现在我想在每个索引位置创建一个填充了A列 - B列的行值的新列,以便结果如下所示:
df:
A B A-B
0 1 2 -1
1 3 4 -1
2 2 2 0
我已经有效的解决方案,但只有当我不在函数中使用它时:
for index, row in df.iterrows():
print index
df['A-B']=df['A']-df['B']
这给了我想要的输出,但当我尝试将它用作函数时,我收到错误。
def test(x):
for index, row in df.iterrows():
print index
df['A-B']=df['A']-df['B']
return df
df.apply(test)
ValueError: cannot copy sequence with size 4 to array axis with dimension 3
我在这里做错了什么,如何才能让它发挥作用?
答案 0 :(得分:3)
这是因为默认情况下apply
方法适用于列,如果您想通过行,请将axis
更改为1:
轴:{0或'索引',1或'列'},默认为0
- 0或'index':将函数应用于每列
- 1或'columns':将函数应用于每一行
df.apply(test, axis=1)
修改强>
我认为你需要对每一行做一些复杂的操作。如果您只需要相互减去列:
df['A-B'] = df.A - df.B
答案 1 :(得分:2)
如Anton所示,您应该使用axis=1
参数执行apply函数。但是,没有必要像在函数测试中那样遍历行,因为
apply
documentation提及:
传递给函数的对象是Series对象
所以你可以将功能简化为:
def test(x):
x['A-B']=x['A']-x['B']
return x
然后运行:
df.apply(test,axis=1)
请注意,实际上您已将test x
的参数命名为,而在函数x
中根本不使用test
。
最后我应该评论你可以用pandas进行列式操作(即没有for循环)只做这个:
df['A-B']=df['A']-df['B']
另见: