如何对列不同或列数同列名异的Pandas DataFrame进行行绑定?
嘿,这两个都是Pandas日常操作里很常见的拼接需求,我给你拆解清楚:
问题1:列不同的两个Pandas DataFrame行绑定
要实现列不同的DataFrame垂直行绑定,最直接的方法就是用pd.concat()函数,它默认会采用**外连接(outer join)**的方式处理不同列——也就是保留所有列,缺失的部分用NaN填充。
举个实际例子:
import pandas as pd # 创建两个列不同的DataFrame df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) df2 = pd.DataFrame({'B': [5, 6], 'C': [7, 8]}) # 执行行绑定,ignore_index=True用来重置行索引,避免重复 combined_df = pd.concat([df1, df2], axis=0, ignore_index=True)
运行后combined_df的结果是:
| A | B | C | |
|---|---|---|---|
| 0 | 1 | 3 | NaN |
| 1 | 2 | 4 | NaN |
| 2 | NaN | 5 | 7 |
| 3 | NaN | 6 | 8 |
如果只需要保留两个DataFrame共有的列,可以把join参数设为'inner',这样就只会保留重叠的列(比如上面例子里的B列)。
问题2:列数相同但列名不同的垂直绑定
这种情况分两种场景,取决于你想要的拼接逻辑:
场景1:按列的位置拼接(不管列名,第一列拼第一列)
如果两个DataFrame的列数相同,且你希望忽略列名,直接按位置对应拼接,最稳妥的方法是先把第二个DataFrame的列名改成和第一个一致,再执行concat:
import pandas as pd df1 = pd.DataFrame({'X': [1, 2], 'Y': [3, 4]}) df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]}) # 把df2的列名替换成df1的列名 df2.columns = df1.columns # 执行垂直绑定 combined_df = pd.concat([df1, df2], ignore_index=True)
结果会是:
| X | Y | |
|---|---|---|
| 0 | 1 | 3 |
| 1 | 2 | 4 |
| 2 | 5 | 7 |
| 3 | 6 | 8 |
场景2:按列的含义拼接(指定列名映射)
如果列名不同但含义对应(比如df1的X对应df2的A,Y对应B),可以手动指定列名映射后再拼接:
# 自定义列名映射 column_mapping = {'A': 'X', 'B': 'Y'} df2_renamed = df2.rename(columns=column_mapping) # 拼接 combined_df = pd.concat([df1, df2_renamed], ignore_index=True)
这样就能精准对应你想要的列含义,避免拼接错误。
注意:如果直接不修改列名就执行
concat,会因为列名不同而保留所有列,结果会出现大量NaN,这通常不是我们想要的垂直绑定效果。
内容的提问来源于stack exchange,提问作者user14185647
相关产品推荐
相关产品推荐

