我有2种不同大小的数据框。
在df1上,我有日志中的date
,time
,username
,email address
,phone number
,duration
。但是email address
和phone number
只是带有空字符串的列。
在df2上,我拥有数据库中的所有username
,email address
和phone number
。
如何根据用户名将df2合并到df1中?
这意味着df1的大小将保持不变,但是将填充email address
和phone number
列。当然有来自df2的匹配数据
假设username
是唯一的
答案 0 :(得分:1)
您可以使用此:
df = df1[['username', 'date', 'time', 'duration']].merge(df2, left_on='username', right_on='username')
示例: df1
date duration email address phone number time username
0 2015 5 14:00 aa
1 2016 10 16:00 bb
df2
email address phone number username
0 rrr@ 333444 aa
1 tt@ 555533 bb
输出:
username date time duration email address phone number
0 aa 2015 14:00 5 rrr@ 333444
1 bb 2016 16:00 10 tt@ 555533
答案 1 :(得分:1)
将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