我正在尝试使用person_id上的pandas
合并/合并两个数据框。
如果找到匹配项,则应添加或更新电子邮件字段。
它不应该创建新行,该新行在Table_A中存在。
Table_A
+-----------+-----------------+------+
| person_id | email | lang |
+-----------+-----------------+------+
| 1 | | EN |
| 2 | tes2@foo.com | FR |
| 3 | tes3@barbar.com | DK |
+-----------+-----------------+------+
Table_B
+-----------+--------------+------+
| person_id | email | kids |
+-----------+--------------+------+
| 1 | tes1@foo.com | 2 |
| 2 | tes2@foo.com | 0 |
| 3 | tes3@foo.com | 0 |
| 4 | tes4@foo.com | 1 |
+-----------+--------------+------+
我正在寻找的结果是
+-----------+--------------+------+------+
| person_id | email | kids | lang |
+-----------+--------------+------+------+
| 1 | tes1@foo.com | 2 | EN |
| 2 | tes2@foo.com | 0 | FR |
| 3 | tes3@foo.com | 0 | DK |
| 4 | tes5@foo.com | 1 | |
+-----------+--------------+------+------+
我尝试过
df_merged=pd.merge(Table_A,Table_B,on=["person_id"], how="left")
这给了我正确的字段,但也创建了email_x和email_y字段。我只想要一个电子邮件字段。
答案 0 :(得分:1)
这是一个临时解决方案...
合并两个数据框并添加后缀。
dfNew = df.merge(df1, left_index=True, right_index=True,how='outer', suffixes=('_y', ''))
#result
person_id_y email_y lang person_id email kids
1 None EN 1 tes1@foo.com 2
2 tes2@foo.bar FR 2 tes2@foo.com 0
3 tes2@barbar.com DK 3 tes3@foo.com 0
NaN NaN NaN 4 tes4@foo.com 1
然后仅过滤所需的列
dfNew = dfNew[['person_id','email','kids','lang']]
person_id email kids lang
1 tes1@foo.com 2 EN
2 tes2@foo.com 0 FR
3 tes3@foo.com 0 DK
4 tes4@foo.com 1 NaN
答案 1 :(得分:0)
您可以同时合并:
>>> x=pd.DataFrame([['1','a','bla'],[2,'b','blu'],[3,'c','blo'],[4]],columns=('id','le','bl'))
>>> y=pd.DataFrame([['1','a','abla'],[2,'b','ablu'],[3,'c','ablo'],[4,'d','ab']],columns=('id','le','ab'))
>>> x
id le bl
0 1 a bla
1 2 b blu
2 3 c blo
3 4 None None
>>> y
id le ab
0 1 a abla
1 2 b ablu
2 3 c ablo
3 4 d ab
>>> pd.merge(x,y,on=['id','le'],how='right')
id le bl ab
0 1 a bla abla
1 2 b blu ablu
2 3 c blo ablo
3 4 d NaN ab
当然,默认行为是在所有相同的字段上合并:
>>> pd.merge(x,y,how='right')
id le bl ab
0 1 a bla abla
1 2 b blu ablu
2 3 c blo ablo
3 4 d NaN ab
您需要在此处将how
的值更改为right
,因为从第一封电子邮件中丢失了一封电子邮件(如果二者都缺少密钥,那么最好使用how='outer'
,还有一些额外的行要处理。