首页 文章

使用pandas连接两个数据帧中的不同列(并附加类似的列)

提问于
浏览
3

我的问题与Pandas Merge - How to avoid duplicating columns but not identical. 密切相关

我想连接三个数据帧中不同的列 . 数据框有一个列id,有些列是相同的:Ex .

DF1

id place name qty unit A 
1 NY    Tom   2  10   a
2 TK    Ron   3  15   a
3 Lon   Don   5  90   a
4 Hk    Sam   4  49   a

DF2

id place name qty unit B 
1 NY    Tom   2  10   b
2 TK    Ron   3  15   b
3 Lon   Don   5  90   b
4 Hk    Sam   4  49   b

DF3

id place name qty unit C D
1 NY    Tom   2  10   c d
2 TK    Ron   3  15   c d
3 Lon   Don   5  90   c d
4 Hk    Sam   4  49   c d

结果:

id place name qty unit A B C D
1 NY    Tom   2  10   a b c d
2 TK    Ron   3  15   a b c d
3 Lon   Don   5  90   a b c d
4 Hk    Sam   4  49   a b c d

列的位置,名称,数量和单位将始终是三个数据框的一部分,不同的列的名称可能会有所不同(在我的示例中为A,B,C,D) . 三个数据帧具有相同的行数 .

我试过了:

cols_to_use = df1.columns - df2.columns
dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how='outer')

问题是我获得了比预期更多的行,并且在结果数据帧中重命名了列(使用concat时) .

4 回答

  • 7

    您只能从 df2 (和类似的 df3 )中提取 df1 中尚未存在的那些列 . 然后只需使用pd.concat连接数据框:

    cols = [c for c in df2.columns if c not in df1.columns]
    df = pd.concat([df1, df2[cols]], axis=1)
    
  • 2

    使用 reduce 来自 functools

    from functools import reduce
    reduce(lambda left,right: pd.merge(left,right), [df1,df2,df3])
    Out[725]: 
       id place name  qty  unit  A  B  C  D
    0   1    NY  Tom    2    10  a  b  c  d
    1   2    TK  Ron    3    15  a  b  c  d
    2   3   Lon  Don    5    90  a  b  c  d
    3   4    Hk  Sam    4    49  a  b  c  d
    
  • 0

    您可以使用嵌套合并

    merge_on = ['id','place','name','qty','unit']
    df1.merge(df2, on = merge_on).merge(df3, on = merge_on)
    
    
    
        id  place   name    qty unit    A   B   C   D
    0   1   NY      Tom     2   10      a   b   c   d
    1   2   TK      Ron     3   15      a   b   c   d
    2   3   Lon     Don     5   90      a   b   c   d
    3   4   Hk      Sam     4   49      a   b   c   d
    
  • 4

    使用 concatgroupbyfirst

    pd.concat([df1, df2, df3], 1).groupby(level=0, axis=1).first()
    
    A  B  C  D  id name place  qty  unit
    0  a  b  c  d   1  Tom    NY    2    10
    1  a  b  c  d   2  Ron    TK    3    15
    2  a  b  c  d   3  Don   Lon    5    90
    3  a  b  c  d   4  Sam    Hk    4    49
    

相关问题