基于一列的不同大小数据帧上的Pandas合并

2024-06-23 20:12:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同大小的数据帧。在

{{cd2>{cd6}}和^列是空的。在

在df2上,我有数据库中的所有usernameemail address和{}。在

如何根据用户名将df2合并到df1中? 意思是说df1的大小将保持不变,但是email address和{}列将被填充。当然有来自df2的匹配数据

假设username是唯一的


Tags: 数据用户数据库addressemailusernamedf1df2
2条回答

^{}与left join和参数suffixes一起使用,lastr remove original columnsemail address和{}(with _):

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

^{pr2}$

另一种解决方案是使用^{}表示未在列表中定义的所有列名称,使用^{}表示与列的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

您可以使用这个:

df = df1[['username', 'date', 'time', 'duration']].merge(df2, left_on='username', right_on='username')

示例: df1型

^{pr2}$

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

相关问题 更多 >

    热门问题