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
相关产品推荐
相关产品推荐

