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