我遇到了问题,我找到了一个解决方案,但我觉得这样做的方法不对。也许,还有更多的规范'这样做的方法。
我已经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
有没有人有更好的方法? 谢谢!
答案 0 :(得分:1)
我认为您可以使用DataFrame.isin
检查DataFrames
中同一行的位置。然后按mask
创建NaN
,combine_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)