如何堆叠两个 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