如何提升Python Pandas补全CSV缺失数据的程序运行速度?
用Pandas高效补全子集CSV的缺失数据
你的两层循环效率极低的原因是iterrows()是逐行迭代逻辑,且两层循环的时间复杂度为O(n*m),面对10万+行的主文件会产生巨量运算。下面用Pandas的向量化操作替代,能大幅提升处理速度:
核心思路
以子集的第3、27列为匹配键关联主文件,提取需要补全的第4、5列数据,用主文件的值填充子集的缺失项,最终保留子集原有结构。
步骤代码
建议用实际列名替代索引(更清晰且避免列顺序变动出错),以下示例假设:
- 匹配键:
key1(原第3列)、key2(原第27列) - 需要补全的列:
col4(原第4列)、col5(原第5列)
import pandas as pd # 读取CSV文件(替换为你的文件路径) master = pd.read_csv('master.csv') subset = pd.read_csv('subset.csv') # 1. 从主文件中仅提取匹配键和需要补全的列,减少不必要的数据处理 master_fill = master[['key1', 'key2', 'col4', 'col5']] # 2. 对主文件的匹配键去重(确保每个(key1,key2)组合仅保留一行,和原循环"找到第一个匹配项即停止"逻辑一致) master_fill = master_fill.drop_duplicates(subset=['key1', 'key2'], keep='first') # 3. 左连接子集和主文件的补全数据,保留子集所有行 merged = subset.merge( master_fill, on=['key1', 'key2'], how='left', suffixes=('', '_master') # 区分子集和主文件的同名列 ) # 4. 用主文件的数据补全子集的缺失值 merged['col4'] = merged['col4'].combine_first(merged['col4_master']) merged['col5'] = merged['col5'].combine_first(merged['col5_master']) # 5. 移除合并产生的冗余列,得到更新后的子集 updated_subset = merged.drop(['col4_master', 'col5_master'], axis=1) # 输出或保存结果 print(updated_subset) # updated_subset.to_csv('updated_subset.csv', index=False)
关键说明
- 向量化优势:Pandas的
merge和combine_first都是底层优化的向量化运算,时间复杂度接近O(n),远快于逐行循环。 - 去重必要性:如果主文件存在重复的匹配键组合,提前去重可避免合并后出现多余行,保证补全逻辑和原循环一致。
- 列名替代索引:用实际列名代替
values[3]这类索引,代码可读性更强,也能避免列顺序变动导致的错误。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

