如何在Python3中纵向拼接列数不同的DataFrame?
实现DataFrame的非对齐纵向追加
原始数据
import pandas as pd df1 = pd.DataFrame({'A': [3, 6], 'B': [4, 7]}, index=[1,2]) df2 = pd.DataFrame({'C': [20.0, 40.0], 'D': [30.0, 50.0], 'E': [61.2, 33.8], 'F': [29.1, 36.4]}, index=[1,2])
df1输出:
A B 1 3 4 2 6 7
df2输出:
C D E F 1 20.0 30.0 61.2 29.1 2 40.0 50.0 33.8 36.4
期望结果
A B 1 3 4 2 6 7 3 C D E F 4 20.0 30.0 61.2 29.1 5 40.0 50.0 33.8 36.4
问题分析
常规的pd.concat()或pd.append()都是按列名对齐拼接,无法实现这种将df2的列名和数据作为独立行追加到df1后的效果。
解决方案
我们需要将所有数据转换为行列表,手动合并后重新生成DataFrame:
# 将df1的行转为列表 df1_rows = df1.values.tolist() # 将df2的列名作为一行 df2_header = df2.columns.tolist() # 将df2的行转为列表 df2_rows = df2.values.tolist() # 合并所有行 all_rows = df1_rows + [df2_header] + df2_rows # 生成新的DataFrame并设置连续索引 result = pd.DataFrame(all_rows, index=range(1, len(all_rows)+1)) # 给前两列保留原df1的列名,多余列自动命名 result.columns = list(df1.columns) + [f'Unnamed_{i}' for i in range(len(result.columns)-len(df1.columns))] print(result)
输出结果:
A B Unnamed_2 Unnamed_3 1 3 4 NaN NaN 2 6 7 NaN NaN 3 C D E F 4 20.0 30.0 61.2 29.1 5 40.0 50.0 33.8 36.4
如果不需要多余列的自定义命名,也可以直接使用默认数字列名:
result = pd.DataFrame(all_rows, index=range(1, len(all_rows)+1)) print(result)
输出:
0 1 2 3 1 3 4 NaN NaN 2 6 7 NaN NaN 3 C D E F 4 20.0 30.0 61.2 29.1 5 40.0 50.0 33.8 36.4
这种方式完全符合需求,将df2的列名和数据行作为独立行追加到df1末尾,不做列对齐。
内容的提问来源于stack exchange,提问作者PTTX
相关产品推荐
相关产品推荐

