如何高效基于另一列批量更新Pandas列值(百万级数据)
高效实现百万行数据的Sub-Reason随机赋值
针对百万行数据表的Sub-Reason列批量随机赋值需求,逐行循环会导致极低的执行效率,以下是基于pandas向量化操作的高效实现方案:
核心解决方案
利用布尔索引批量筛选行,并一次性生成对应数量的随机值,彻底避免逐行操作:
import pandas as pd import numpy as np # 定义Reason与对应Sub-Reason选项的映射关系 reason_sub_mapping = { 'Maintenance': ['Indoor Connection', 'Last Mile Connection'], 'New Connection': ['Delayed Connection', 'Connection Request'], 'Billing': ['Update Request', 'Change Personal Info'], 'Complaints': ['Wire Cut', 'Bad Service'] } # 初始化Sub-Reason列(若已存在全NaN列可跳过) cop2['Sub-Reason'] = np.nan # 批量处理每个Reason类别 for reason, sub_options in reason_sub_mapping.items(): # 筛选当前Reason对应的所有行 reason_mask = cop2['Reason'] == reason # 获取该类别的行数 row_count = reason_mask.sum() # 批量生成随机选择的Sub-Reason值并赋值 cop2.loc[reason_mask, 'Sub-Reason'] = np.random.choice(sub_options, size=row_count)
效率提升原因
- 批量操作替代逐行循环:通过布尔索引一次性筛选目标行,避免了pandas中逐行访问的高昂开销,百万级数据下执行时间可压缩至秒级
- 批量生成随机值:单次调用
np.random.choice生成对应数量的随机值,减少了循环中重复调用函数的额外消耗 - 直接批量赋值:利用
loc一次性完成整组行的赋值操作,比逐行赋值效率提升几个数量级
原代码的问题分析
- 逐行循环的性能瓶颈:pandas数据框的逐行操作本身效率极低,百万行数据会导致大量的内存IO和函数调用开销,这是执行耗时50分钟的核心原因
- 代码错误:原代码中存在拼写错误(
co2['Reason']应为cop2['Reason']),以及判断条件错误(将New Connection误写为Connection),会导致部分逻辑无法正常生效 - 重复随机调用:每次循环都单独调用
np.random.choice,增加了不必要的函数调用成本
备选方案(简洁但效率略低)
如果追求代码简洁性,也可以使用apply方法,但本质仍是逐行处理,效率略低于批量赋值方案:
def assign_sub_reason(reason): return np.random.choice(reason_sub_mapping.get(reason, [np.nan])) cop2['Sub-Reason'] = cop2['Reason'].apply(assign_sub_reason)
内容的提问来源于stack exchange,提问作者mouhamad
相关产品推荐
相关产品推荐

