Pandas(Python)-根据条件从另一个数据框更新数据框的列

5

我有一个问题并找到了解决方案,但我感觉这不是正确的方法。也许有更多“规范”的方法。

问题

我有两个数据框,想要合并它们,而不需要额外的列,并且不会删除现有的信息。例如:

现有数据框(df)

   A  A2  B
0  1   4  0
1  2   5  1

要合并的数据框(df2)

   A  A2  B
0  1   4  2
1  3   5  2

如果'A'和'A2'列相应的话,我想用'df2'更新'df'。结果如下(:):
   A  A2    B
0  1   4  2.0 <= Update value ONLY
1  2   5  1.0

这是我的解决方案,但我认为它并不是一个真正好的解决方案。

import pandas as pd

df = pd.DataFrame([[1,4,0],[2,5,1]],columns=['A','A2','B'])

df2 = pd.DataFrame([[1,4,2],[3,5,2]],columns=['A','A2','B'])

df = df.merge(df2,on=['A', 'A2'],how='left')
df['B_y'].fillna(0, inplace=True)
df['B'] = df['B_x']+df['B_y']
df = df.drop(['B_x','B_y'], axis=1)
print(df)

有没有更好的方法呢? 谢谢!

2个回答

9

是的,可以不使用合并来完成:

rows = (df[['A','A2']] == df2[['A','A2']]).all(axis=1)
df.loc[rows,'B'] = df2.loc[rows,'B']

简单而优雅。谢谢! :) - Lerenn
嗨!我有两个不同的DF(DF1和DF2),我面临着与此处相同的问题。我尝试了这个解决方案,但是出现了以下错误:“ValueError: Can only compare identically-labeled DataFrame objects”。两个DF的大小不同,但相关的列具有相同的标签。我为什么会收到此错误?我做了这个:values = (df[[SITE_IP,PORT_NAME]] == dfLags[[SITE_IP,PORT_NAME]]).all(axis=1) - Lucas Aimaretto
除了列之外,行也有标签存储在索引中。例如,使用 df3 = df.copy(); df3.index = ['G', 'H'],比较 df[['A','A2']] == df3[['A','A2']] 会产生相同的错误。因此,即使具有相同的形状,也无法进行有效的比较。也许一些利用广播的 numpy 技巧可以在这里帮助解决问题。 - Quickbeam2k1

1
你可以尝试这个:

df.ix[df2.loc[(df['A'] == df2['A']) & (df['A2'] ==   
df2['A2']),'B'].index.values,'B'] = \
df2.loc[(df['A'] == df2['A']) & (df['A2'] == df2['A2']),'B']

比Quickbeam2k1的代码略长,但它能完成任务。谢谢 :) - Lerenn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接