合并数据框,添加/更新字段

时间:2018-11-08 12:24:31

标签: python python-3.x pandas merge

我正在尝试使用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字段。我只想要一个电子邮件字段。

2 个答案:

答案 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' ,还有一些额外的行要处理。