You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化大型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:30:04