这是一个简单的问题,但是我在这里找到的大多数解决方案都是基于一个列匹配(主要是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
答案 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