比较两个数据帧并将数据附加到 python pandas 中

时间:2021-07-30 14:38:31

标签: python pandas

我有一个示例数据框 df1

id  user_id     name             email       
1     1        John         John@example.com
2     2        Alves        alves@example.com
3     3        Kristein     kristein@example.com
4     4        James        james@example.com

第二个数据框 df2

id      user       user_email_1            user_email_2         status
1      Sanders     sanders@example.com                          active
2      Alves       alves111@example.com   alves@example.com     active
3      Micheal     micheal@example.com                          active
4      James       james@example.com                            delete

如何将状态数据从 df2 添加到 df1 if

user_id of df1id of df2

name of df1user of df2

email of df1user_email_1user_email_2 of df2 匹配并删除不匹配的记录?

预期结果df1

id   user_id    name       email                status
2      2        Alves     alves@example.com     active
4      4        James     james@example.com     delete

例如:

alves@example.com 中的 df1user_email_2 匹配时,它附加了状态数据。

2 个答案:

答案 0 :(得分:-1)

你应该使用 merge

df1.merge(df2.reset_index(), how='inner', left_on=['name', 'email', 'id'], right_on=['user', 'user_email', 'index'])

答案 1 :(得分:-1)

重新排列您的数据框 df2 以仅获得一个 user_email 列,然后合并两个数据框并保留所需的列:

df2 = df2.set_index(['id', 'user', 'status']).stack() \
         .rename('user_email').reset_index()

out = pd.merge(df1, df2, left_on=['user_id', 'name', 'email'],
                         right_on=['id', 'user', 'user_email'],
                         suffixes=('', '2')) \
          [['id', 'user_id', 'name', 'email', 'status']]
>>> out

   id  user_id   name              email  status
0   2        2  Alves  alves@example.com  active
1   4        4  James  james@example.com  delete
<块引用>

在哪里使用 user_email_2 列

user_email_1user_email_2 列堆叠为一列。转换后,df2 看起来像:

>>> df2

   id     user  status       level_3            user_email
0   1  Sanders  active  user_email_1   sanders@example.com
1   2    Alves  active  user_email_1  alves111@example.com
2   2    Alves  active  user_email_2     alves@example.com
3   3  Micheal  active  user_email_1   micheal@example.com
4   4    James  delete  user_email_1     james@example.com