如何避免pandas read_csv读取单行时重复值被自动编号?
解决pandas逐行读取超大CSV时列名自动加后缀的问题
问题根源
你用skiprows=lambda x: x!=i逐行读取时,若目标行不是原CSV的列名行(第0行),pandas会跳过列名行,把目标行当作DataFrame的列名。而目标行里的重复值会被pandas自动添加.1/.2后缀以避免列名冲突,写入CSV后就会导致其他软件无法正常读取。
替代方案
方案1:用pandas的chunksize=1分块读取
这种方式会保留原CSV的列名,每个chunk对应一行数据,处理时不会出现列名异常,同时适合超大型文件的内存友好处理:
import pandas as pd # 先写入输出文件的列名 with open('output.csv', 'w', newline='', encoding='utf-8') as f_out: # 仅读取列名行 header_df = pd.read_csv('large_file.csv', nrows=0) header_df.to_csv(f_out, index=False) # 逐块读取,每块1行 for chunk in pd.read_csv('large_file.csv', chunksize=1): # 修改当前行数据,示例:修改某列值 chunk.loc[chunk.index[0], 'target_column'] = 'modified_content' # 插入新行(按需执行) new_row = chunk.copy() new_row.loc[new_row.index[0], 'target_column'] = 'new_row_content' # 写入处理后的行和新行(不重复写表头) chunk.to_csv(f_out, mode='a', header=False, index=False) new_row.to_csv(f_out, mode='a', header=False, index=False)
方案2:用Python原生csv模块逐行处理
如果不需要pandas的数据分析功能,原生csv模块更轻量,完全手动控制行数据,彻底避开列名冲突问题:
import csv with open('large_file.csv', 'r', encoding='utf-8') as f_in, \ open('output.csv', 'w', newline='', encoding='utf-8') as f_out: # 按字典格式读取行,自动识别列名 reader = csv.DictReader(f_in) writer = csv.DictWriter(f_out, fieldnames=reader.fieldnames) # 写入表头 writer.writeheader() for row in reader: # 修改当前行数据 row['target_column'] = 'modified_content' writer.writerow(row) # 插入新行(按需执行) new_row = row.copy() new_row['target_column'] = 'new_row_content' writer.writerow(new_row)
内容的提问来源于stack exchange,提问作者Dirk_63
相关产品推荐
相关产品推荐

