Pandas高效处理800万行CSV:基于已有行生成新行的最优方案
高效处理800万行CSV的行扩展方案
针对你的需求——基于每行的b和c列生成b+i(i从0到c)的新行,以下是两种高效实现方案,避免Python循环的低效问题:
方案一:Python(pandas+numpy矢量化/分块处理)
利用numpy的矢量化操作和pandas的分块读取,既保证速度又解决内存不足问题:
完整内存处理(内存足够时)
import pandas as pd import numpy as np # 读取CSV,分隔符根据实际调整(示例为空格) df = pd.read_csv('input.csv', sep=' ', header=0) # 计算每行需要生成的行数:c+1(i从0到c共c+1个值) repeats = df['c'] + 1 # 重复a、c列对应次数 a_expanded = np.repeat(df['a'].values, repeats) c_expanded = np.repeat(df['c'].values, repeats) # 生成扩展后的b列:每个原始b值拼接0到c的序列,再展平 b_expanded = np.concatenate([np.arange(b, b + c + 1) for b, c in zip(df['b'], df['c'])]) # 构建结果DataFrame并保存 result_df = pd.DataFrame({'a': a_expanded, 'b': b_expanded, 'c': c_expanded}) result_df.to_csv('output.csv', sep=' ', index=False)
分块处理(内存不足时)
如果800万行无法一次性加载到内存,用分块读取逐步处理:
import pandas as pd import numpy as np chunk_size = 100000 # 每次处理10万行,根据内存调整 output_path = 'output.csv' with open(output_path, 'w') as f_out: first_write = True # 逐块读取输入文件 for chunk in pd.read_csv('input.csv', sep=' ', header=0, chunksize=chunk_size): repeats = chunk['c'] + 1 a_expanded = np.repeat(chunk['a'].values, repeats) c_expanded = np.repeat(chunk['c'].values, repeats) b_expanded = np.concatenate([np.arange(b, b + c + 1) for b, c in zip(chunk['b'], chunk['c'])]) chunk_result = pd.DataFrame({'a': a_expanded, 'b': b_expanded, 'c': c_expanded}) # 第一块写入表头,后续块跳过表头 chunk_result.to_csv(f_out, sep=' ', index=False, header=first_write) first_write = False
方案二:awk命令行工具
awk是轻量级文本处理工具,逐行处理无需加载整个文件,内存占用极低,速度快:
编写awk脚本(expand.awk)
BEGIN {OFS=" "} # 设置输出分隔符为空格 NR==1 {print; next} # 打印表头后跳过 { # 循环生成i从0到$3(c列)的行 for(i=0; i<=$3; i++){ print $1, $2+i, $3 } }
执行命令
awk -f expand.awk input.csv > output.csv
方案选择
- 若需后续用Python做数据处理,优先选pandas分块方案;
- 若仅需文本转换,awk更高效、轻量,适合超大文件。
内容的提问来源于stack exchange,提问作者secret
相关产品推荐
相关产品推荐

