如何将行长度不一致的Pandas DataFrame导出为无多余分隔符的CSV
Pandas导出CSV去除多余尾部分隔符方案
问题原因
读取CSV时指定了固定5列的列名后,pandas默认的to_csv方法会按总列数补全分隔符,哪怕行尾的列全是空值也会追加对应的分号,全空的分段行也会被填充为连续分号,目前pandas没有内置参数可以直接关闭这个默认行为。
实现代码
直接替换原来的to_csv调用即可,不需要修改之前的读取、数据修改逻辑,支持保留分段空行、不输出多余尾部分隔符:
import pandas as pd with open('out.csv', 'w', encoding='utf-8') as out_f: for _, row in pat.iterrows(): # 过滤掉当前行所有空值,只保留有效字段 valid_fields = [] for val in row: if pd.notna(val): # 不需要清理字段前后空格的话,去掉.strip()即可 valid_fields.append(str(val).strip()) # 全空行直接写入换行,保留原文件的分段结构 if not valid_fields: out_f.write('\n') else: # 用分号加空格拼接有效字段,和原文件格式保持一致 out_f.write('; '.join(valid_fields) + '\n')
效果说明
- 之前对CustomerID等字段的修改会完整保留,比如修改后的CustomerID行输出为
CustomerID; HASHED,不会带末尾多余分号 - 原文件里的分段空行会完整保留,不会出现空行被填充为连续分号的情况
- 不同长度的行只会输出实际存在的字段,不会因为定义了5列就强行补全4个分隔符
如果数据量比较大,也可以用apply方式先批量生成每行内容再写入,运行效率更高:
pat['line_content'] = pat.apply( lambda r: '; '.join([str(v).strip() for v in r if pd.notna(v)]), axis=1 ) with open('out.csv', 'w', encoding='utf-8') as out_f: out_f.write('\n'.join(pat['line_content']) + '\n')
内容的提问来源于stack exchange,提问作者Renate van Kempen
相关产品推荐
相关产品推荐

