Pandas(Python) - 更新具有条件和不同列的另一个数据框的列

时间:2016-11-29 14:00:07

标签: python pandas

我遇到了问题,我找到了一个解决方案,但我觉得这样做的方法不对。也许,还有更多的规范'这样做的方法。

我已经had an answer for a really similar problem了,但是在这里,每个数据帧中的行数并不相同。对于"双帖"抱歉,但第一个仍然有效,所以我认为制作一个新的更好。

问题

我有两个数据框,我想合并而没有额外的列,也没有删除现有的信息。示例:

现有数据框(df)

   A  A2  B
0  1   4  0
1  2   5  1
2  2   5  1

要合并的数据框(df2)

   A  A2  B
0  1   4  2
1  3   5  2

如果列' A'我想用df更新df2和' A2'相对应。 结果将是:

   A  A2    B
0  1   4  2 <= Update value ONLY
1  2   5  1
2  2   5  1

这是我的解决方案,但我认为这不是一个非常好的解决方案。

import pandas as pd

df = pd.DataFrame([[1,4,0],[2,5,1],[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)

我尝试了这个解决方案:

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

但由于行数错误,我有这个错误:

ValueError: Can only compare identically-labeled DataFrame objects

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

2 个答案:

答案 0 :(得分:1)

我认为您可以使用DataFrame.isin检查DataFrames中同一行的位置。然后按mask创建NaNcombine_first填充int。最后一次投射到mask = df[['A', 'A2']].isin(df2[['A', 'A2']]).all(1) print (mask) 0 True 1 False 2 False dtype: bool df.B = df.B.mask(mask).combine_first(df2.B).astype(int) print (df) A A2 B 0 1 4 2 1 2 5 1 2 2 5 1

DropwizardMetricServices

答案 1 :(得分:1)

通过对布尔掩码创建方式的微小调整,您可以使其工作:

cols = ['A', 'A2']
# Slice it to match the shape of the other dataframe to compare elementwise
rows = (df[cols].values[:df2.shape[0]] == df2[cols].values).all(1)
df.loc[rows,'B'] = df2.loc[rows,'B']
df

enter image description here