如何将多个列合并为一个?

时间:2018-05-24 17:10:45

标签: python pandas dataframe series

我有一个包含~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])

5 个答案:

答案 0 :(得分:3)

您可以使用:

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

答案 1 :(得分:3)

您可以使用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 :(得分: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:]])})

答案 3 :(得分:2)

理解

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

答案 4 :(得分:0)

您可以使用:

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