使用pandas.concat合并同结构CSV文件出现列错位问题的技术求助
问题根源:列名不匹配导致的合并异常
你的代码思路本身没问题,但问题出在两个CSV文件的列名不一致上:
ex1.csv的第一行被你当作表头(因为用了header=0),所以列名被识别为Ex1和Ex1.1(重名列会自动添加后缀)ex2.csv的第一行同样被当作表头,列名被识别为Ex2和Ex2.1
Pandas的concat会保留所有不同列名的列,不存在对应列的行就用NaN填充,这就是你看到异常结果的原因。
解决方案
根据你的实际场景,有两种针对性的处理方式:
情况1:CSV文件没有表头,第一行就是数据
如果你的两个CSV里所有行都是数据(包括第一行),只是误把第一行当成了表头,那修改读取逻辑,告诉Pandas不要将第一行识别为表头:
import os import pandas as pd import glob joined_files = os.path.join(".", "*.csv") joined_list = glob.glob(joined_files) li = [] for filename in joined_list: # header=None 表示文件无表头,第一行直接作为数据行 df = pd.read_csv(filename, index_col=None, header=None, sep=',') li.append(df) frame = pd.concat(li, axis=0, ignore_index=True) # 如果需要给合并后的文件添加自定义表头,可在保存时指定 frame.to_csv('merged.csv', index=False, header=['Col1', 'Col2']) print(frame)
这样合并后的结果就会是你预期的所有行依次追加,不会出现NaN。
情况2:CSV确实有表头,但表头文字不同(结构一致)
如果两个CSV确实有表头,只是表头文字不同(但列的含义/结构完全一致),可以统一所有DataFrame的列名后再合并:
import os import pandas as pd import glob joined_files = os.path.join(".", "*.csv") joined_list = glob.glob(joined_files) li = [] for filename in joined_list: df = pd.read_csv(filename, index_col=None, header=0, sep=',') li.append(df) # 将所有DataFrame的列名统一为第一个文件的列名 for df in li[1:]: df.columns = li[0].columns frame = pd.concat(li, axis=0, ignore_index=True) frame.to_csv('merged.csv', index=False) print(frame)
这样合并后的列名会和第一个CSV的表头保持一致,所有行正常追加。
内容的提问来源于stack exchange,提问作者apt45
相关产品推荐
相关产品推荐

