连接两个具有不同标题的数据帧

问题描述 投票:0回答:1

如何连接 2 个具有不同长度标头的数据帧?我想将第二个数据帧的标题添加为一行。

下面是我的

df1
:

df1 = pd.DataFrame({'A': [1, 2], 'B': [2, 3], 'C': [3, 4]})

df1

   A  B  C
0  1  2  3
1  2  3  4

df2

df2 = pd.DataFrame({'D': [34, 'e'], 'E': ['rt', 'rt']})

df2

    D   E
0  34  rt
1   e  rt

我的预期输出:

df = pd.DataFrame({'A': [1, 2,'D',34,'e'], 'B': [2, 3,'E','rt','rt'], 
                   'C': [3, 4,'','','']})

    A   B  C
0   1   2  3
1   2   3  4
2   D   E   
3  34  rt   
4   e  rt   

到目前为止我的尝试未能达到我的预期输出:

(1)

df = pd.concat([df1, df2], axis = 0/1)

(2)

df1_header = pd.DataFrame([df2.columns], columns=df1.columns)
df2.columns = df1.columns 
result = pd.concat([df1_header, df1, df2], ignore_index=True)
python pandas dataframe merge concatenation
1个回答
1
投票

这是一种方法:

df = (
    pd.concat(
        [
            df1,
            df2.T.reset_index().T.rename(
                columns={k: v for k, v in iter(enumerate(df1.columns))}
                )
        ],
        axis=0,
        ignore_index=True
    )
)

输出

    A   B  C
0   1   2  3
1   2   3  4
2   D   E   
3  34  rt   
4   e  rt   

解释

  • 使用
    df2
    df.T
     和再次 
    df.reset_index
    df.T
    的列名称移至第一行。重置后,
    df2
    现在将具有列名称
    [0, 1]
    ,而不是
    ['D', 'E']
  • 接下来,我们可以使用字典理解来映射
    df1
    中的列名称,并使用 iter
    df.rename
     版本将迭代器 (
    enumerated
    ) 传递到 
    df1.columns
  • 最后,在 pd.concat
     上使用 
    axis=0
     并忽略索引。
  • 您的输出包含空字符串而不是
    NaN
    值。如果您想坚持这一点,请添加
    df.fillna('')
© www.soinside.com 2019 - 2024. All rights reserved.