如何一次合并两列的数据框

时间:2019-10-17 10:26:18

标签: python pandas data-analysis

我有两个数据框。第一个包含有关订单的数据:df_1,其列['uid','revenue','order_day']有50415行。第二个包含有关访问的信息:df_2,列['uid','source','session_day']包含358532行。我想从访问者的数据框中获取客户来源。我试图通过两列合并数据帧:result = df_1.merge(df_2, how=left ,left_on=['uid','order_day'],right_on=['uid','session_day'])但是结果是我得到62369行,并且'revenue'列的总和增加了。我不明白为什么会这样。当我写how='left'时,我希望左边的df_1不变,并且将添加df_2中'uid''..._day'中相似的行。有人可以向我解释为什么我没有得到预期的结果,我应该怎么做?感谢您的任何评论

1 个答案:

答案 0 :(得分:0)

合并结果中的行数超过 df_1 中的行数 可以在以下示例中进行解释:

df_1 包含2行:

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

df_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_day == 2019-09-01 , 它将与 df_1 中索引为 0 的行合并。
  • 两行,其中 uid == 111 session_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 中,您必须从 df_2 中的 drop_duplacates 开始,并使用 subset 包含合并列。