在具有不同实例数的特定列上合并两个不同长度的数据帧

时间:2017-05-02 15:38:10

标签: python pandas dataframe

我有两个数据帧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

3 个答案:

答案 0 :(得分:3)

您想离开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样式合并

答案 1 :(得分:2)

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

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')
来自评论的

  

为什么这需要设置D2的索引?其他答案不会这样做。 - ErikE

     

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

选项2:map + assign
此解决方案将D2转换为dict,例如pd.Series,索引为'ID',值为'Target'map会将'ID'上的D1列转换为新值,然后我们将其分配到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

答案 2 :(得分:0)

D1.merge(D2, how='left', on="ID")

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