【问题标题】:pandas create new column after merge熊猫合并后创建新列
【发布时间】:2021-08-10 14:38:57
【问题描述】:

提前感谢您抽出宝贵时间帮助我

我有 2 个数据框: 1 - 带有我要发送给用户的通知的数据框

notifications_to_send = pd.DataFrame({'user_id': ['201', '207', '223', '212', '112', '311'],
                   'id_notification': ['1', '1', '1', '1', '1', '1'],
                     'email':['user1@gmail.com','user2@gmail.com','user3@gmail.com','user4@gmail.com','user5@gmail.com','user6@gmail.com']
                     })
   user_id   id_notification    email
0   201             1           user1@gmail.com
1   207             1           user2@gmail.com
2   223             1           user3@gmail.com
3   212             1           user4@gmail.com
4   112             1           user5@gmail.com
5   311             1           user6@gmail.com

2 - 包含用户信息的数据框,这些用户设置选项不限制向他们发送通知的数量

unlimited_notifications = pd.DataFrame({'user_id': ['201', '212'],
                   'id_notification': ['1', '2']})
  user_id   id_notification
0   201           1
1   212           2

所以我想将“send_push”列添加到第一个数据帧,这将确定如果用户设置了无限选项,将发送推送 我考虑过在 user_id 和 id_notification 上合并 2 个数据框

notifications_to_send.merge(unlimited_notifications, on=['user_id','id_notification'], how='left')

,对于符合此条件的行,'send_push' 将设置为 True,如果条件不执行则将其设置为 Null,因此如下所示:

  user_id    id_notification    email             send_push
0   201             1           user1@gmail.com    True
1   207             1           user2@gmail.com    null
2   223             1           user3@gmail.com    null
3   212             1           user4@gmail.com    null
4   112             1           user5@gmail.com    null
5   311             1           user6@gmail.com    null

所以问题是如何在合并时添加新列,或者是否有其他方法可以实现?比较两个数据框?

【问题讨论】:

  • 不确定我是否关注 - unlimited_notifications 数据框是否仅包含您希望 send_push 列成为 True 的用户?该数据框上的id_notification 列是否有任何意义?
  • @jfaccioni 我有不同的通知,所以用户可以选择他总是会收到其中一个,如果他没有设置无限选项,例如,id = 1 的通知他只会收到一次一周,但如果他设置此选项,我将每周发送此通知 5 次
  • 嗨!以下任何一个答案是否有效?如果是这样并且如果您愿意,您可以考虑接受其中一个以向其他人发出问题已解决的信号。如果没有,您可以提供反馈,以便改进(或完全删除)

标签: python pandas dataframe merge


【解决方案1】:

执行左合并,然后比较两个 df 的 'id_notification',最后据此分配值:

import numpy as np

notifications_to_send=notifications_to_send.merge(unlimited_notifications,how='left',on='user_id',suffixes=('','_y'))
notifications_to_send['send_push']=np.where(notifications_to_send.eval("id_notification==id_notification_y"),True,pd.NA)
notifications_to_send=notifications_to_send.drop(columns='id_notification_y')

或

没有np.where():

notifications_to_send=notifications_to_send.merge(unlimited_notifications,how='left',on='user_id',suffixes=('','_y'))
m=notifications_to_send['id_notification'].eq(notifications_to_send.pop('id_notification_y'))
notifications_to_send.loc[m,'send_push']=True
notifications_to_send.loc[~m,'send_push']=pd.NA

【讨论】:

    【解决方案2】:

    您可以在合并之前将 send_push 列添加到第二个数据帧。

    合并时,只有 userid 和 id_notification 与第一个数据帧匹配的行才会返回 True。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2021-01-16
      • 2019-05-28
      • 2020-12-04
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多