Pandas按State列唯一值拆分大型DataFrame分块保存CSV方法
代码失效的核心原因
- 变量名冲突:外层分块循环和内层分组循环都用
i作为迭代变量,会产生变量覆盖,导致逻辑执行异常 - 冗余错误的拼接逻辑:
df = df.append(df)会把当前分块内的同州数据重复拼接一次,凭空生成一倍无效数据,且pandas 2.0+版本已经完全移除append方法,运行会直接报错 - 文件写入模式错误:
to_csv默认使用覆盖写入模式,每读取一个新分块就会把之前写入的同州文件内容清空,最终每个输出文件只会保留最后一个分块里的对应州数据,无法得到全量结果
可直接运行的修复代码
import pandas as pd import os source_path = "DataJune.txt" output_folder = "tempcsv/" # 自动创建输出目录,避免路径不存在报错 os.makedirs(output_folder, exist_ok=True) # 记录已经写入过表头的州,避免重复写入表头 written_states = set() # 逐块读取大文件,迭代变量使用不同命名避免冲突 for chunk_id, chunk in enumerate(pd.read_csv(source_path, sep='|', chunksize=1000000)): # 按当前块内的State列分组 for state_name, state_part in chunk.groupby('State'): save_path = os.path.join(output_folder, f"{state_name}.csv") if state_name not in written_states: # 第一次写入该州文件:新建文件,写入表头+当前块数据 state_part.to_csv(save_path, sep=",", index=False, mode="w", header=True) written_states.add(state_name) else: # 后续写入该州文件:追加模式,不写表头 state_part.to_csv(save_path, sep=",", index=False, mode="a", header=False)
方案说明
- 全程内存仅占用单个分块的大小,完全适配9000万行级别的大文件处理,不会出现内存溢出问题
- 自动适配不同文件中State列的动态唯一值数量,不需要提前手动枚举州名
- 自动兼容Windows、macOS、Linux多系统的路径格式,避免跨系统运行报错
- 如果State列的取值包含
/、\、:等文件系统不允许的特殊字符,可以在生成save_path前对state_name做字符替换,避免文件创建失败
内容的提问来源于stack exchange,提问作者user1955215
相关产品推荐
相关产品推荐

