Pandas DataFrame导出为规范CSV时输出格式异常问题求助
Pandas循环导出CSV结果异常问题解决
问题描述
在循环迭代过程中每次将pandas DataFrame导出为CSV文件时,导出结果不符合预期,已尝试切换utf-8、utf-16等编码导出,问题未得到改善。
待导出的DataFrame从pickle文件构建生成,已确认该差异不是问题根源。
原实现代码
for pickle_file in files: key = pickle_file.split('/')[5].split('\\')[1] + '_' + pickle_file.split('/')[5].split('\\')[4] with lz4.frame.open(pickle_file, "rb") as f: while True: try: diz[key].append(pickle.load(f)) except EOFError: break for key in diz.keys(): a = diz[key] for j in range(len(a)): t = a[j] for index,row in t.iterrows(): if row['MODE'] != 'biflow': w = row['W'] feature = row['FEATURE'] mean = row['G-MEAN'] rmse = row['RMSE'] df.loc[-1] = [w] + [feature] + [rmse] + [mean] + [key] df.index = df.index + 1 df = df.sort_values(by = ['W']) df.to_csv(path + key + '.csv', index = False) df = df[0:0]
效果对比
- 实际导出结果:

- 期望导出结果:

问题根因
- 未显式初始化DataFrame的列顺序,按位置给
loc[-1]赋值时容易出现值和列错位的问题 - 逐行使用
loc[-1]追加数据的方式不规范,容易出现索引异常、数据类型推断错误等问题 - 导出CSV时未处理字段内的分隔符冲突,如果字段值中包含逗号,会导致单字段被拆分为多列
解决方案
1. 显式初始化DataFrame结构
在循环开始前先定义DataFrame的列,和插入值的顺序完全对应:
import pandas as pd df = pd.DataFrame(columns=['W', 'FEATURE', 'RMSE', 'G-MEAN', 'key'])
2. 替换逐行追加逻辑
改用列表暂存所有行数据,最后一次性转换为DataFrame,性能更高且稳定性更好:
for key in diz.keys(): rows = [] a = diz[key] for j in range(len(a)): t = a[j] for _, row in t.iterrows(): if row['MODE'] != 'biflow': w = row['W'] feature = row['FEATURE'] mean = row['G-MEAN'] rmse = row['RMSE'] rows.append([w, feature, rmse, mean, key]) # 一次性生成DataFrame df = pd.DataFrame(rows, columns=['W', 'FEATURE', 'RMSE', 'G-MEAN', 'key']) df = df.sort_values(by=['W']) # 导出时使用utf-8-sig编码适配Excel,开启自动引用避免分隔符冲突 df.to_csv(f"{path}{key}.csv", index=False, encoding='utf-8-sig', quoting=1)
3. 可选适配方案
如果后续需要用其他工具读取CSV,也可以指定分隔符为制表符,进一步降低分隔符冲突概率:
df.to_csv(f"{path}{key}.csv", index=False, encoding='utf-8-sig', sep='\t')
内容的提问来源于stack exchange,提问作者QueryQuasar
相关产品推荐
相关产品推荐

