如何堆叠两个 pandas 数据框而不丢失列名?
How to stack two pandas dataframe and not loosing column names?
我有两个非常不同的 pandas DataFrame,它们具有唯一的列名。我想将它们堆叠在 another.Nothing 下,否则需要“并集”或“交集”。就像“复制粘贴”一个下一个。而且我也不想丢失任何列名。
Df1:
Col1
1 A C
2 B D
3 X Y
DF2:
Col2 Col3 Col4 Col5
1 a c x t
2 b d y j
3 b e z k
我尝试使用 pd.concat([df1,df2], axis=0, ignore_index = True) 但结果是这样的:
Col1
1 A C Nan Nan Nan Nan
2 B D Nan Nan Nan Nan
3 X Y Nan Nan Nan Nan
4 Nan Nan Col2 Col3 Col4 Col5
5 Nan Nan a c x t
6 Nan Nan b b y j
7 Nan Nan b e z k
预期结果:
Col1
1 A C Nan Nan
2 B D Nan Nan
3 X Y Nan Nan
4 Col2 Col3 Col4 Col5
5 a c x t
6 b b y j
7 b e z k
原始 DF
DF1
DF2
Pandas 不允许多个未命名的列(即名称为空字符串的列),因为列名必须是唯一的。也就是说,我认为这接近您想要的结果。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Col1':[*'ABX'],'':[*'CDY']})
df2 = pd.DataFrame({'Col2':[*'abb'],'Col3':[*'cde'],'Col4':[*'xyz'],'Col5':[*'tjk']})
mat1 = np.vstack([df1.columns,df1.to_numpy()])
mat2 = np.vstack([df2.columns,df2.to_numpy()])
df = pd.concat([pd.DataFrame(mat1),pd.DataFrame(mat2)])
生成的数据帧 df
是
0 1 2 3
0 Col1 NaN NaN
1 A C NaN NaN
2 B D NaN NaN
3 X Y NaN NaN
0 Col2 Col3 Col4 Col5
1 a c x t
2 b d y j
3 b e z k
这是一个非常奇怪的重塑。您不能直接将 header 移动为行,但一个技巧是在转置上 reset_index
。
对于concat
,将header列放在一边,然后放回去:
cols = df1.columns
(pd.concat([df1.set_axis(range(df1.shape[1]), axis=1),
df2.T.reset_index().T], ignore_index=True)
.rename(columns=dict(enumerate(cols))))
输出:
Col1 2 3
0 A C NaN NaN
1 B D NaN NaN
2 X Y NaN NaN
3 Col2 Col3 Col4 Col5
4 a c x t
5 b d y j
6 b e z k
我有两个非常不同的 pandas DataFrame,它们具有唯一的列名。我想将它们堆叠在 another.Nothing 下,否则需要“并集”或“交集”。就像“复制粘贴”一个下一个。而且我也不想丢失任何列名。
Df1:
Col1
1 A C
2 B D
3 X Y
DF2:
Col2 Col3 Col4 Col5
1 a c x t
2 b d y j
3 b e z k
我尝试使用 pd.concat([df1,df2], axis=0, ignore_index = True) 但结果是这样的:
Col1
1 A C Nan Nan Nan Nan
2 B D Nan Nan Nan Nan
3 X Y Nan Nan Nan Nan
4 Nan Nan Col2 Col3 Col4 Col5
5 Nan Nan a c x t
6 Nan Nan b b y j
7 Nan Nan b e z k
预期结果:
Col1
1 A C Nan Nan
2 B D Nan Nan
3 X Y Nan Nan
4 Col2 Col3 Col4 Col5
5 a c x t
6 b b y j
7 b e z k
原始 DF
DF1
DF2
Pandas 不允许多个未命名的列(即名称为空字符串的列),因为列名必须是唯一的。也就是说,我认为这接近您想要的结果。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Col1':[*'ABX'],'':[*'CDY']})
df2 = pd.DataFrame({'Col2':[*'abb'],'Col3':[*'cde'],'Col4':[*'xyz'],'Col5':[*'tjk']})
mat1 = np.vstack([df1.columns,df1.to_numpy()])
mat2 = np.vstack([df2.columns,df2.to_numpy()])
df = pd.concat([pd.DataFrame(mat1),pd.DataFrame(mat2)])
生成的数据帧 df
是
0 1 2 3
0 Col1 NaN NaN
1 A C NaN NaN
2 B D NaN NaN
3 X Y NaN NaN
0 Col2 Col3 Col4 Col5
1 a c x t
2 b d y j
3 b e z k
这是一个非常奇怪的重塑。您不能直接将 header 移动为行,但一个技巧是在转置上 reset_index
。
对于concat
,将header列放在一边,然后放回去:
cols = df1.columns
(pd.concat([df1.set_axis(range(df1.shape[1]), axis=1),
df2.T.reset_index().T], ignore_index=True)
.rename(columns=dict(enumerate(cols))))
输出:
Col1 2 3
0 A C NaN NaN
1 B D NaN NaN
2 X Y NaN NaN
3 Col2 Col3 Col4 Col5
4 a c x t
5 b d y j
6 b e z k