【问题标题】:How to merge multiple columns into one? [duplicate]如何将多列合并为一列? [复制]
【发布时间】:2018-11-04 00:01:39
【问题描述】:

我有一个大约 100 万行和大约 20 列的数据框。我希望将这些列合并为一个;在同一唯一标识符列下。

为了说明,这是原始数据:

          ID   Column 2 Column 3
0       1001          B        A
1       1002          C        D
2       1003          E        E
3       1004          G        H

期望的结果:

          ID     Merged
0       1001          B
1       1001          A
2       1002          C
3       1002          D
4       1003          E
5       1003          E
6       1004          G
7       1004          H

由于我希望合并大约 20 列;我需要通过循环合并它们。我使用了下面的代码,但总是出现内存错误。

master = pd.DataFrame()
for col in original_df:  # original_df is the dataframe combining the 20 columns
    if col != 'ID':
        temp = pd.DataFrame()
        temp['ID'] = original_df['ID']
        temp['Merged'] = original_df[col]
        master = master.append([temp])

【问题讨论】:

  • 这不是一个重复的问题。即使相同“ID”值的“合并”值相同,OP 也需要重复的“ID”值。另一个问题没有。

标签: python pandas dataframe series


【解决方案1】:

你可以使用df.melt,像这样:

newdf = (df.melt(id_vars='ID', value_vars = ['Column 2', 'Column 3'],
                 value_name='Merged')
         .drop('variable', axis=1)
         .sort_values('ID'))

>>> newdf
     ID Merged
0  1001      B
4  1001      A
1  1002      C
5  1002      D
2  1003      E
6  1003      E
3  1004      G
7  1004      H

【讨论】:

    【解决方案2】:

    你可以使用:

    In [43]: df.set_index('ID').stack().reset_index(level=1, drop=True).to_frame('Merged').reset_index()
    
    Out[43]: 
         ID Merged
    0  1001      B
    1  1001      A
    2  1002      C
    3  1002      D
    4  1003      E
    5  1003      E
    6  1004      G
    7  1004      H
    

    【讨论】:

      【解决方案3】:

      这是使用numpy 的有效方式。

      给定两列

      import pandas as pd, numpy as np
      
      res = pd.DataFrame({'ID': np.repeat(df['ID'], 2),
                          'Data': np.hstack((df['Column 2'], df['Column 3']))})
      
      print(res)
      
        Data    ID
      0    B  1001
      0    C  1001
      1    E  1002
      1    G  1002
      2    A  1003
      2    D  1003
      3    E  1004
      3    H  1004
      

      给定任意数量的列

      您可以使用numpy.hstack 的列表推导:

      res = pd.DataFrame({'ID': np.repeat(df['ID'], len(df.columns[1:])),
                          'Data': np.hstack([df[col] for col in df.columns[1:]])})
      

      【讨论】:

        【解决方案4】:

        理解

        pd.DataFrame([[i, v] for i, *V in df.values for v in V], columns=['ID', 'Merged'])
        
             ID Merged
        0  1001      B
        1  1001      A
        2  1002      C
        3  1002      D
        4  1003      E
        5  1003      E
        6  1004      G
        7  1004      H
        

        【讨论】:

          【解决方案5】:

          你可以使用:

          df.set_index('ID').stack().reset_index().drop(['level_1'], axis=1).rename(columns={0:'Merged'})
          
          ID  Merged
          0   1001    B
          1   1001    A
          2   1002    C
          3   1002    D
          4   1003    E
          5   1003    E
          6   1004    G
          7   1004    H
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-28
            • 2012-07-19
            • 1970-01-01
            • 2020-05-01
            相关资源
            最近更新 更多