【问题标题】:How to put 2 different dataframes in pandas如何在熊猫中放置 2 个不同的数据框
【发布时间】:2020-03-07 07:31:37
【问题描述】:

我想合并两个顺序不同的文件:

我想在file1和file2下面合并:

文件1:

col1   col2   col3
A001   B001   C001
A002   B002   C002
A003   B003   C003
A004   B004   C004
A005   B005   C005
A006   B006   C006

文件2:

col1   col2
A001   8
A002   2
A003   4
A004   1
A005   8
A006   3
B001   7
B002   4
B003   10
B004   11
B005   8
B006   3
C001   2
C002   9
C003   8
C004   1
C005   7
C006   6

获得以下信息:

col1   col2   col3  col4  col5  col6
A001   8      B001  7     C001  2
A002   2      B002  4     C002  9
A003   4      B003  10    C003  8
A004   1      B004  11    C004  1
A005   8      B005  8     C005  7
A006   3      B006  3     C006  6

非常感谢您的帮助:)

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案1】:

    除了我喜欢它之外,没有人声称这更好。

    def f():
        m = dict(zip(*map(file2.get, file2)))
        for i, c in enumerate(file1):
            yield file1[c].rename(f'col{i * 2 + 1}')
            yield file1[c].replace(m).rename(f'col{i * 2 + 2}')
    
    pd.concat(f(), axis=1)
    
       col1 col2  col3 col4  col5  col6
    0  A001    8  B001    7  C001     2
    1  A002    2  B002    4  C002     9
    2  A003    4  B003   10  C003     8
    3  A004    1  B004   11  C004     1
    4  A005    8  B005    8  C005     7
    5  A006    3  B006    3  C006     6
    

    这真的让我很困扰,因为没有一种超级简单的方法可以做到这一点。
    这是另一个公式

    m = dict(zip(*map(file2.get, file2)))
    
    pd.concat({
        (c, i): a
        for c in file1
        for i, a in enumerate([file1[c], file1[c].replace(m)])
    }, axis=1)
    
       col1     col2      col3   
          0  1     0   1     0  1
    0  A001  8  B001   7  C001  2
    1  A002  2  B002   4  C002  9
    2  A003  4  B003  10  C003  8
    3  A004  1  B004  11  C004  1
    4  A005  8  B005   8  C005  7
    5  A006  3  B006   3  C006  6
    

    【讨论】:

      【解决方案2】:

      这是一个更易读的解决方案,使用 for loopenumerateSeries.map

      for idx, col in enumerate(df1.columns):
          df1[f'{col}_{idx+1}'] = df1[col].map(df2.set_index('col1')['col2'])
      
      df1 = df1.sort_index(axis='columns')
      
         col1  col1_1  col2  col2_2  col3  col3_3
      0  A001       8  B001       7  C001       2
      1  A002       2  B002       4  C002       9
      2  A003       4  B003      10  C003       8
      3  A004       1  B004      11  C004       1
      4  A005       8  B005       8  C005       7
      5  A006       3  B006       3  C006       6
      

      【讨论】:

        【解决方案3】:

        我会做什么replace

        df=pd.concat([file1,file1.replace(dict(zip(file2.col1,file2.col2))).add_suffix('_1')],axis=1).\
           sort_index(axis=1)
        
        
           col1  col1_1  col2  col2_1  col3  col3_1
        0  A001       8  B001       7  C001       2
        1  A002       2  B002       4  C002       9
        2  A003       4  B003      10  C003       8
        3  A004       1  B004      11  C004       1
        4  A005       8  B005       8  C005       7
        5  A006       3  B006       3  C006       6
        

        【讨论】:

        • 很好,我在想类似:df2.set_index([df2['col1'].str[0],df2.groupby(df2['col1'].str[0]).cumcount()]).unstack(0).sort_index(1,1) 但后来看到它是一个合并的东西
        • 谢谢,完美运行。我只是不明白你的代码中发生了什么。如果你能尽快解释一下:)
        • @sebk 我们使用 file2 创建替换 dict ,然后我们将 key 映射到 file1 ,从 file2 中查找值
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多