如何在迭代pandas数据框时创建新列并插入行值

时间:2015-12-07 08:10:00

标签: python pandas iteration dataframe

我正在尝试创建一个逐行迭代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

我在这里做错了什么,如何才能让它发挥作用?

2 个答案:

答案 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']

另见: