【问题标题】:How to merge two dataframes with overlapping columns, update existing values and add new values如何合并具有重叠列的两个数据框,更新现有值并添加新值
【发布时间】:2021-09-22 11:06:41
【问题描述】:

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

我需要将data2 中的所有值添加到data1,如果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'])       
    

我想更新两个数据框中存在的值,如果它们不在第一个数据框中,则添加新行:

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?

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    你可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2023-01-08
      • 2021-04-07
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多