Используйте merge
с левым соединением и параметром suffixes
, последним удаляйте исходные столбцы email address
и phone number
(с _
):
df1 = pd.DataFrame({
'username':list('abccdd'),
'email address':[''] * 6,
'phone number':[''] * 6,
'duration':[5,3,6,9,2,4],
})
print (df1)
username email address phone number duration
0 a 5
1 b 3
2 c 6
3 c 9
4 d 2
5 d 4
df2 = pd.DataFrame({
'username':list('abcd'),
'email address':['a@a.sk','b@a.sk','c@a.sk','d@a.sk'],
'phone number':range(4)
})
print (df2)
username email address phone number
0 a a@a.sk 0
1 b b@a.sk 1
2 c c@a.sk 2
3 d d@a.sk 3
df = (df1.merge(df2, on='username', how='left', suffixes=('_',''))
.drop(['email address_','phone number_'], axis=1)
.reindex(columns=df1.columns))
print (df)
username email address phone number duration
0 a a@a.sk 0 5
1 b b@a.sk 1 3
2 c c@a.sk 2 6
3 c c@a.sk 2 9
4 d d@a.sk 3 2
5 d d@a.sk 3 4
Другое решение с difference
для всех имен столбцов без определения в списке и reindex
для того же порядка, как в df1
столбцов:
c = df1.columns.difference(['email address','phone number'])
df = df1[c].merge(df2, on='username', how='left').reindex(columns=df1.columns)
print (df)
username email address phone number duration
0 a a@a.sk 0 5
1 b b@a.sk 1 3
2 c c@a.sk 2 6
3 c c@a.sk 2 9
4 d d@a.sk 3 2
5 d d@a.sk 3 4