Python DataFrame分块处理时非首块新列行索引错位问题求助
问题根因
你遇到的索引错位问题核心原因是:pandas 读文件拆分出来的每个chunk,行索引默认继承原文件的全局索引,并非每个chunk独立从0开始编号。
- 第一个chunk的全局索引刚好是
0 ~ CHUNK_SIZE-1,和你用enumerate得到的chunk内相对行号完全匹配,所以写入没问题 - 从第二个chunk开始,全局索引起始值是
CHUNK_SIZE,你用相对行号通过loc赋值时,找不到对应索引就会生成空行、或者和原有行错位,最终导致数据异常。
修复方案
最简单的修改方式是每个chunk加载后先重置索引,保证每个chunk的行号从0开始,适配你现有的赋值逻辑,修改后的代码如下:
# create chunks BATCH_NUMBER = 1 # 注意要先初始化批次号 for chunk in pd.read_csv(SOURCE_FILE, chunksize = CHUNK_SIZE): print('BATCH:', BATCH_NUMBER) # 新增:重置chunk索引,丢弃原有全局索引 chunk = chunk.reset_index(drop=True) # machine translate for row_index, text in enumerate(chunk.title): print('Text:', text) print('Row Index:', row_index) (label, confidence) = MODEL.predict(text) label = label[0] confidence = confidence[0] chunk.loc[row_index, 'Language'] = label[9:] chunk.loc[row_index, 'Confidence'] = confidence chunk.to_csv(f'Chunks/chunk{BATCH_NUMBER}.csv', index = False) BATCH_NUMBER += 1
优化建议
你现有的分块处理逻辑是合理的,是处理超出内存的大文件的通用规范方案,不过可以进一步优化执行效率:
- 避免逐行遍历赋值,如果你的MODEL支持批量输入,可以直接把整个
chunk.title列传入预测,一次性生成所有结果再赋值给新列,速度会比逐行循环快很多
示例:
# 批量预测替代逐行循环 labels, confidences = MODEL.predict(chunk.title.tolist()) chunk['Language'] = [x[0][9:] for x in labels] chunk['Confidence'] = [x[0] for x in confidences]
内容的提问来源于stack exchange,提问作者Rohaan Nadeem
相关产品推荐
相关产品推荐

