熊猫-基于多列匹配替换行值

时间:2020-05-12 22:04:49

标签: python pandas

这是一个简单的问题,但是我在这里找到的大多数解决方案都是基于一个列匹配(主要是ID)。

Df1
'Name'    'Dept'   'Amount'    'Leave'
ABC         1         10          0
BCD         1          5          0



Df2
'Alias_Name', 'Dept', 'Amount', 'Leave', 'Address', 'Join_Date'
ABC             1        100       5      qwerty       date1
PQR             2         0        2      asdfg        date2

当两个Name and Dept都匹配时,我想替换df1中的行值。 我尝试了merge(left_on=['Name', 'Dept'], right_on=['Alias_Name', 'Dept'], how='left'),但是它给了我两倍的带有_x和_y后缀的列。如果名称和部门与df2中的任何行匹配,我只需要替换df1中的Dept, Amount, Leave

所需的输出:

Name     Dept     Amount     Leave
ABC        1       100         5
BCD        1        5          0

3 个答案:

答案 0 :(得分:0)

您可以在两个数据框中创建一个临时列,该列将是“名称”和“部门”的总和。该列可用作匹配的主键

答案 1 :(得分:0)

new_df = df1[['Name', 'Dept']].merge(df2[['Alias_Name', 'Dept', 'Amount', 'Leave']].rename(columns={'Alias_Name': 'Name'}), how='left').fillna(df1[['Amount', 'Leave']])

结果:

  Name  Dept  Amount  Leave
0  ABC     1   100.0    5.0
1  BCD     1     5.0    0.0

如果重要的话,您可以使用new_df[['Amount', 'Leave']] = new_df[['Amount', 'Leave']].astype(int)重播dtype

答案 2 :(得分:0)

尝试:

# select rows that should be replace
replace_df = df1[['Name', 'Dept']].merge(df2, left_on=['Name', 'Dept'], right_on=['Alias_Name', 'Dept'], how='inner')
# replace rows in df1
df1.iloc[replace_df.index] = replace_df

结果:

        Name    Dept    Amount  Leave
    0   ABC      1       100    5
    1   BCD      1         5    0