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

如何高效基于另一列批量更新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)

效率提升原因

  1. 批量操作替代逐行循环:通过布尔索引一次性筛选目标行,避免了pandas中逐行访问的高昂开销,百万级数据下执行时间可压缩至秒级
  2. 批量生成随机值:单次调用np.random.choice生成对应数量的随机值,减少了循环中重复调用函数的额外消耗
  3. 直接批量赋值:利用loc一次性完成整组行的赋值操作,比逐行赋值效率提升几个数量级

原代码的问题分析

  1. 逐行循环的性能瓶颈:pandas数据框的逐行操作本身效率极低,百万行数据会导致大量的内存IO和函数调用开销,这是执行耗时50分钟的核心原因
  2. 代码错误:原代码中存在拼写错误(co2['Reason']应为cop2['Reason']),以及判断条件错误(将New Connection误写为Connection),会导致部分逻辑无法正常生效
  3. 重复随机调用:每次循环都单独调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:45:46