pandas concat正确实现:多CSV拼接后列重复列数翻倍问题求解
两个DataFrame拼接后列数翻倍,本质是pandas识别到两个表的列名不完全匹配,即使肉眼看列名一致,大概率存在不可见的格式差异或者类型差异。
排查步骤
- 首先验证列名是否真的完全一致,执行代码:
print(data_1.columns.equals(data_2.columns))
如果返回False就可以确认是列名不匹配的问题。
常见问题和修复方案
- 列名存在前后空白字符(空格、制表符、换行符等)
执行以下代码清洗两个表的列名,去除首尾空白:
data_1.columns = data_1.columns.str.strip() data_2.columns = data_2.columns.str.strip()
- 列名存在大小写差异
统一将列名转成全小写/全大写:
data_1.columns = data_1.columns.str.lower() data_2.columns = data_2.columns.str.lower()
- 列名数据类型不一致
比如某列名在第一个表是整数1,第二个表是字符串'1',看起来一致但pandas会判定为不同列,统一转成字符串类型即可:
data_1.columns = data_1.columns.astype(str) data_2.columns = data_2.columns.astype(str)
- 读取CSV时参数不统一
如果其中一个表读取时设置了index_col=0把第一列设为索引,另一个没有,也会导致列数量和列名不匹配,检查两个CSV的读取代码,保持参数一致即可。 - 如果你确认两个表的列顺序完全一致,可以直接强制对齐列名:
data_2.columns = data_1.columns
完整示例代码
import pandas as pd # 统一列名清洗函数 def clean_df_columns(df): df.columns = df.columns.astype(str).str.strip().str.lower() return df # 清洗两个数据表 data_1 = clean_df_columns(data_1) data_2 = clean_df_columns(data_2) # 执行拼接,ignore_index=True自动重置行索引 concat_result = pd.concat([data_1, data_2], axis=0, ignore_index=True)
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

