如何合并两个具有重叠列的数据框,更新现有值并添加新值

How to merge two dataframes with overlapping columns, update existing values and add new values

我想合并两个数据帧并从第二个数据帧更新第一个数据帧中的值。

我需要添加从 data2data1 的所有值,如果 username 已经存在于 data1 中,我需要 amount 值是从 data2.

更新
import pandas as pd
data1 = pd.DataFrame([['user1',  10], ['user2', 11], ['user3',  12],['user4',10]], columns=['username', 'amount'])
data2 = pd.DataFrame([['user4', 15], ['user5', 60]], columns=['username', 'amount'])
#Desired dataframe:  
data3= pd.DataFrame([['user1',  10], ['user2', 11], ['user3',  12],['user4',15], ['user5', 60]],columns=['username', 'amount'])       
    

我想更新两个数据框中存在的 vaues 并添加新行(如果它们不在第一个数据框中):

Dataframes:
data1:
username    amount
0   user1   10
1   user2   11
2   user3   12
3   user4   10

data2:
username    amount
0   user4   15
1   user5   60

data3: (Desired dataframe)
username    amount
0   user1   10
1   user2   11
2   user3   12
3   user4   15
4   user5   60

我尝试了 Concat、Merge、Update、Join,但无法让它们按照我想要的方式工作。

连接:

print('Concat:')
df_concat = pd.concat([data1, data2], axis=0, join='outer', ignore_index='true', verify_integrity='True')
display(df_concat)


username    amount
0   user1   10
1   user2   11
2   user3   12
3   user4   10
4   user4   15
5   user5   60

合并:

print('Merge:')
df_merge = data1.merge(data2,how='outer', on='username',indicator = True) 
display(df_merge)

username    amount_x    amount_y    _merge
0   user1   10.0    NaN left_only
1   user2   11.0    NaN left_only
2   user3   12.0    NaN left_only
3   user4   10.0    15.0    both
4   user5   NaN 60.0    right_only

更新:

print('Update:')
data1.update(data2)
display(data1)

    username    amount
0   user4   15.0
1   user5   60.0
2   user3   12.0
3   user4   10.0

加入:

print('Join:')
data1.join(data2, how='outer', lsuffix='username', rsuffix='amount')
display(data1)

username    amount
0   user1   10
1   user2   11
2   user3   12
3   user4   10

如何从 data1 和 data2 获取所需的数据帧 data3?

您可以使用 concat + drop_duplicates:

data3 = pd.concat([data1, data2]).drop_duplicates(subset=["username"], keep="last")

print(data3)

输出

  username  amount
0    user1      10
1    user2      11
2    user3      12
0    user4      15
1    user5      60