【问题标题】:Combine two dataframes with same values in several columns在多列中合并两个具有相同值的数据框
【发布时间】:2019-05-10 13:34:07
【问题描述】:

我想合并两个索引号相同但列号不同的数据框,例如:

>>> df1
   col_1 col_2 col_3 col_4
0    a     x    NaN    54
1    a     y     5     34
2    b     z    NaN    64
3    c     z     7     23


>>> df2
   col_1 col_2 col_3 col_4 col_5
0    a     x    NaN    14    14
1    b     z    NaN     9     7
2    c     z     7     51    53
3    a     y     5     87    66

df2 将根据col_1col_2col_3 的值组合成df1

但是行的顺序不会一样。

我想按照df1的顺序组合它们

而答案会是这样的:

   col_1 col_2 col_3 col_4 col_4 col_5
0    a     x    NaN    54    14    14
1    a     y     5     34    87    66
2    b     z    NaN    64     9     7
3    c     z     7     23    51    53

我不关心列名,所以你们可以根据需要修改它们。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

如果我理解正确,您想加入索引而不进行排序:

result = df1.join(df2.drop(columns=['col_1', 'col_2', 'col_3']), lsuffix='x', rsuffix='y', sort=False)
print(result)

输出:

  col_1 col_2 col_3 col_4x col_4y col_5
0     a     x   NaN     54     14    14
1     a     y     5     34      9     7
2     b     z   NaN     64     51    53
3     c     z     7     23     87    66

否则,对前三列进行简单的合并,同样不进行排序:

result = df1.merge(df2, on=['col_1', 'col_2', 'col_3'], sort=False)
print(result)

输出:

  col_1 col_2 col_3 col_4_x col_4_y col_5
0     a     x   NaN      54      14    14
1     a     y     5      34      87    66
2     b     z   NaN      64       9     7
3     c     z     7      23      51    53

【讨论】:

  • 没有注意到这个奇怪的请求(以为他只是希望它根据df1进行排序)。很好的收获。
  • 哦...我很抱歉。 df2 在 col_4 和 col_5 中的值可能会将顺序更改为 df1。
  • 我已经修改了结果。这是我第一次问这个问题,对不起
  • @zero 是的,这很奇怪。我最初也给出了一个基于merge的答案。
【解决方案2】:

你可以使用:

df1.merge(df2, how='right', on=['col_1', 'col_2', 'col_3'], sort=False)

  col_1 col_2  col_3  col_4_x  col_4_y  col_5
0     a     x    NaN       54       14     14
1     a     y    5.0       34       87     66
2     b     z    NaN       64        9      7
3     c     z    7.0       23       51     53

【讨论】:

    【解决方案3】:

    只需使用可用的合并功能

    import pandas as pd
    
    df=df1.merge(df2,left_index=True)
    

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 2013-12-08
      • 2017-05-18
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多