如何优化大型Pandas DataFrame中指定值对应列值修改的运行效率
性能优化方案
原代码运行慢的核心原因是存在大量Python层的嵌套循环、全表重复扫描,没有用到Pandas向量化操作的优势,可通过以下方案优化:
核心优化思路
- 避免逐值扫描全表,仅做1次全表匹配判断
- 消除所有逐行遍历的Python循环,所有匹配、过滤操作走Pandas C层实现
- 替换链式索引赋值,避免临时副本开销和潜在赋值失败问题
最优实现代码
方案1:适配大多数场景,可读性和性能平衡
# 1. 把目标键转集合,加速匹配判断 icd_set = set(icd_keys) # 2. 一次性扫描全表,得到所有值属于目标键的布尔掩码 match_mask = d.isin(icd_set) # 3. 转成长格式提取所有匹配位置,避免嵌套循环 match_pos = d[match_mask].stack().reset_index() match_pos.columns = ["row_idx", "origin_col", "target_col"] # 4. 去重避免重复赋值 match_pos = match_pos.drop_duplicates(subset=["row_idx", "target_col"]) # 5. 批量赋值,仅循环目标列数量次,无逐行操作 for col, group in match_pos.groupby("target_col"): d.loc[group["row_idx"], col] = True
方案2:极致性能,完全消除Python层循环
如果目标键数量极大,可进一步去掉列遍历,用多级索引一次性赋值:
icd_set = set(icd_keys) match_mask = d.isin(icd_set) match_pos = d[match_mask].stack().reset_index() match_pos = match_pos.drop_duplicates(subset=["level_0", 0])[["level_0", 0]] # 构造多级索引直接批量赋值 d = d.stack(dropna=False) d.loc[pd.MultiIndex.from_frame(match_pos)] = True d = d.unstack()
性能提升效果
对于千万级行的DataFrame,优化后运行速度通常可以提升10~100倍,数据规模越大提升效果越明显。
内容的提问来源于stack exchange,提问作者Masoud Khani
相关产品推荐
相关产品推荐

