如何在上按两列合并数据帧

2024-09-24 02:14:38 发布

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

我有两个数据帧。第一个包含关于订单的数据:df\u 1,列为['uid'、'revenue'、'order\u day'],共50415行。第二个包含关于访问的信息:df\u 2,列为['uid','source','session\u day',行数为358532。我想从访客的数据框中得到客户的来源。我试图通过两列来合并数据帧:result = df_1.merge(df_2, how=left ,left_on=['uid','order_day'],right_on=['uid','session_day']),但结果是得到62369行,'revenue'列的总和增加了。我不明白为什么会这样。当我写how='left'时,我希望左边的dfu 1是不变的,并且将添加在dfu 2中的'uid''..._day'中相似的行。有人能解释一下为什么我没有得到预期的结果,以及我应该怎么做吗?如有任何评论,我们将不胜感激


Tags: 数据订单信息sourcedfuid客户on
1条回答
网友
1楼 · 发布于 2024-09-24 02:14:38

合并结果中的行数超过df\u 1 可以通过以下示例进行解释:

数据框1包含2行:

   uid  revenue   order_day
0  111   200.01  2019-09-01
1  111   300.00  2019-09-02

数据框2包含5行:

   uid  source session_day
0  111   100.0  2019-09-01
1  111   200.0  2019-09-01
2  111   300.0  2019-09-02
3  111   400.5  2019-09-02
4  222   100.0  2019-09-03

请注意,它包含:

  • 两行,uid==111和session\u day==2019-09-01, 它将与df_1中索引为0的行合并
  • 两行,uid==111和session\u day==2019-09-02, 它将与df_1中索引为1的行合并

这就是为什么合并的结果是:

   uid  revenue   order_day  source session_day
0  111   200.01  2019-09-01   100.0  2019-09-01
1  111   200.01  2019-09-01   200.0  2019-09-01
2  111   300.00  2019-09-02   300.0  2019-09-02
3  111   300.00  2019-09-02   400.5  2019-09-02

可能您假设合并是按以下方式执行的:

  • df_1中取一行
  • df_2中查找具有匹配联接列的单个
  • 如果找到,将合并结果(对于这两行)添加到结果中
  • df_1中的下列行重复整个过程

实际上,“左”合并是以另一种方式执行的:

  • df_1取一行(我们称之为基本行
  • 对于df_2中具有匹配联接列(如果找到)的每一行 在结果中生成一行,包括:
    • 来自基本行的内容(来自df_1
    • 当前行的内容(来自df_2

如果要将df_1中的每一行与合并,最多1行 从df_2开始,您必须从drop_duplacates开始,从df_2开始,使用subset 包含合并列

相关问题 更多 >