熊猫根据一列合并到不同大小的数据帧上

时间:2018-10-05 07:40:57

标签: python pandas

我有2种不同大小的数据框。

在df1上,我有日志中的datetimeusernameemail addressphone numberduration。但是email addressphone number只是带有空字符串的列。

在df2上,我拥有数据库中的所有usernameemail addressphone number

如何根据用户名将df2合并到df1中? 这意味着df1的大小将保持不变,但是将填充email addressphone number列。当然有来自df2的匹配数据

假设username是唯一的

2 个答案:

答案 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 addressphone 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