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

Python实现类VLOOKUP逻辑:百万行Excel账号类型填充求助

问题排查与修正方案

原脚本的核心问题

  • 缩进错误:if语句未缩进,违反Python语法规则,会直接触发IndentationError。
  • 整列赋值错误:循环中每次给df_data['Account Type']赋值时,是覆盖整个列而非对应行,最终所有行的Account Type都会变成最后一次循环的结果,完全不符合需求。
  • 未定义变量错误:else分支里的print(N/A),N/A未加引号,Python会将其视为未定义变量,触发NameError。
  • 效率极低:遍历100万行的循环在Pandas中属于低效操作,处理速度极慢,必须用矢量化操作替代。

修正后的高效实现代码

使用numpy.select做矢量化多条件映射,处理百万级数据速度极快:

import numpy as np

# 定义条件列表与对应结果列表
conditions = [
    df_data['Account Number'] <= 99,
    (df_data['Account Number'] >= 100) & (df_data['Account Number'] <= 1999),
    (df_data['Account Number'] >= 2000) & (df_data['Account Number'] <= 2899),
    (df_data['Account Number'] >= 2900) & (df_data['Account Number'] <= 2999),
    (df_data['Account Number'] >= 3000) & (df_data['Account Number'] <= 3999),
    (df_data['Account Number'] >= 4000) & (df_data['Account Number'] <= 4999),
    (df_data['Account Number'] >= 5000) & (df_data['Account Number'] <= 5199),
    (df_data['Account Number'] >= 5200) & (df_data['Account Number'] <= 5399),
    (df_data['Account Number'] >= 5400) & (df_data['Account Number'] <= 5999),
    (df_data['Account Number'] >= 6000) & (df_data['Account Number'] <= 6699),
    (df_data['Account Number'] >= 6700) & (df_data['Account Number'] <= 6799)
]

choices = [
    'Default Value',
    'Assets',
    'Liabilities',
    'Shareholder’s Equity',
    'Allocated charge out of expenses',
    'Operating Expenses',
    'Revenues-Interest Income',
    'Expenses - Interest Expense',
    'Revenues - Trading Gains & Losses',
    'Revenues -Other (Not Subject to GST)',
    'Revenue - Contra- Insurance Claims'
]

# 批量完成列赋值
df_data['Account Type'] = np.select(conditions, choices, default='N/A')

补充:不推荐的循环实现(仅作参考)

如果一定要用循环(处理100万行速度极慢),必须通过行索引定位赋值:

for idx, num in df_data['Account Number'].items():
    if num <= 99:
        df_data.loc[idx, 'Account Type'] = 'Default Value'
    elif 100 <= num <= 1999:
        df_data.loc[idx, 'Account Type'] = 'Assets'
    # 后续elif逻辑依次类推,每个分支都用df_data.loc[idx, 'Account Type']赋值
    else:
        df_data.loc[idx, 'Account Type'] = 'N/A'

内容的提问来源于stack exchange,提问作者Wykky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:45:24