【问题标题】:Merging two dataframes of different length, on a particular column with different number of instances在具有不同实例数的特定列上合并两个不同长度的数据帧
【发布时间】:2017-05-02 15:38:10
【问题描述】:

我有两个数据框 D1 和 D2。两者大小不同,但有一定的关系。 D1 的“ID”列有多个具有相同 ID 的实例,而 D2 只有一个实例。那么如何将这两个数据帧连接在一起呢?

    D1:                             D2:
    ID  val1  val2                  ID   Target   
    1    x     y                    1      0
    1    x     y                    2      1
    2    a     b
    2    a     c

所以在这里我需要在 D1 中有一个新列作为 D1 中每一行的目标,并具有来自 D2 的相应值

    ID  val1  val2 Target   
    1    x     y     0
    1    x     y     0
    2    a     b     1
    2    a     c     1

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    选项 1:join
    此解决方案要求您设置 D2 的索引并使用 on 参数 em>

    D1.join(D2.set_index('ID'), on='ID')
    
       ID val1 val2  Target
    0   1    x    y       0
    1   1    x    y       0
    2   2    a    b       1
    3   2    a    c       1
    

    注意:如果D2 不包括D1.ID 中的所有值,并且您希望D1 的行为空值,则使用how='left'选项。

    D1.join(D2.set_index('ID'), on='ID', how='left')
    

    来自 cmets:

    为什么这需要设置 D2 的索引?其他答案没有这样做。 ——埃里克

    @ErikE 这是合并和连接之间的区别。 pandas.DataFrame.merge 默认会合并列值。而 join 默认查看索引。我可以通过使用 on='ID' 指定要加入的列来覆盖加入行为。但是,该覆盖能力仅限于左侧对象。因此,我必须设置正确对象的索引才能正确执行。 – piRsquared

    选项 2:map + assign
    此解决方案将把 D2 变成 dict 之类的东西pd.Series,索引为'ID's,值为'Target'mapD1 上的'ID' 列转换为新值,我们将其分配给带有assign 的新列。

    D1.assign(Target=D1.ID.map(D2.set_index('ID').Target))
    
    
       ID val1 val2  Target
    0   1    x    y       0
    1   1    x    y       0
    2   2    a    b       1
    3   2    a    c       1
    

    【讨论】:

    • 无论谁对这个答案投了反对票,我都会很高兴知道为什么,这样我就可以改进答案或解决任何问题。这是完成这项任务的两种非常合适的方法。
    • 为什么需要设置D2的索引?其他答案没有这样做。
    • @ErikE 这是mergejoin 之间的区别。 pandas.DataFrame.merge 默认会合并列值。而join 默认查看索引。我可以通过指定与on='ID' 连接的列来覆盖joins 的行为。但是,这种覆盖能力仅限于 left 对象。因此,我必须设置right 对象的索引才能正确执行。
    • 感谢您的解释。作为答案的一部分,您的解释可能会更好。
    【解决方案2】:

    你要离开merge:

    In [36]:
    D1.merge(D2, on='ID', how='left')
    
    Out[36]:
       ID val1 val2  Target
    0   1    x    y       0
    1   1    x    y       0
    2   2    a    b       1
    3   2    a    c       1
    

    这匹配通用列 'ID' 并左合并类似于 SQL 样式合并

    【讨论】:

      【解决方案3】:
      D1.merge(D2, how='left', on="ID")
      

      这相当于 SQL 左连接。这意味着将保留 D1 的每个值,并且将添加与 D2 的 ID 匹配的任何值。

      【讨论】:

        猜你喜欢
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 2020-04-10
        • 2012-12-15
        • 2020-06-25
        • 1970-01-01
        相关资源
        最近更新 更多