Python 如何在数据框中添加*或*更新列?

Python 如何在数据框中添加*或*更新列?,python,pandas,Python,Pandas,我有一个现有的DataFrame,和一个计算要添加到该DataFrame的几个列的方法。我目前使用pd.concat[left,right],axis=1。但是,当我第二次调用此方法时,它会再次使用相同的名称添加列 使用以下左右示例数据帧: 我正在寻找一个foo方法,其结果如下: left = left.foo(right) # or foo(left, right) print(left) one two NEW 0 22 2 33 1 22 3 33

我有一个现有的DataFrame,和一个计算要添加到该DataFrame的几个列的方法。我目前使用pd.concat[left,right],axis=1。但是,当我第二次调用此方法时,它会再次使用相同的名称添加列

使用以下左右示例数据帧:

我正在寻找一个foo方法,其结果如下:

left = left.foo(right)  # or foo(left, right)
print(left)

   one  two  NEW
0   22    2   33
1   22    3   33
2   22    4   33
重要的是,如果我第二次调用left.foorright,我希望结果保持不变

当列已存在时,pd.join会引发错误,pd.concat不会覆盖现有列,pd.update仅覆盖现有列,但不会添加新列

是否有一个函数/方法可以实现我想要的功能/方法,或者我必须自己编写一个

解决方案:下面两个答案结合起来,对我有效的解决方案是:

result = left.\
        drop(left.columns.intersection(right.columns), axis=1).\
        join(right)
获取和列,然后在索引上:

获取和列,然后在索引上:


替代解决方案,但仅添加新列,不覆盖:

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)
print (left)
2   22   33
   one  two  NEW
0    1    2   33
1    2    3   33
2    3    4   33

替代解决方案,但仅添加新列,不覆盖:

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)
print (left)
2   22   33
   one  two  NEW
0    1    2   33
1    2    3   33
2    3    4   33

嗯,是的,这在我发布的示例中有效。但假设每个DF都有许多列,并且您事先不知道左侧已经存在右侧的哪些列。如果pandas还没有实现此功能,那么最终的解决方案将是我的选择。谢谢!它需要一个小的编辑,left.columns.intersection而不是left.columns.difference,但它是这样工作的。我对它做了一些修改,请参见问题底部的更新好的,是的,在我发布的示例中是有效的。但假设每个DF都有许多列,并且您事先不知道左侧已经存在右侧的哪些列。如果pandas还没有实现此功能,那么最终的解决方案将是我的选择。谢谢!它需要一个小的编辑,left.columns.intersection而不是left.columns.difference,但它是这样工作的。我做了一些修改,请参见问题底部的更新
left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)

left = pd.concat([left, right[right.columns.difference(left.columns)]], axis=1)
print (left)
2   22   33
   one  two  NEW
0    1    2   33
1    2    3   33
2    3    4   33