Python Pandas循环无法执行至第三次,触发列长度不匹配错误
问题分析
循环代码报错的核心原因是每次循环都会覆盖原始的df_esn,导致后续循环只能在被过滤后的子集里查找目标ESN。第一次循环后,df_esn只剩第一个ESN对应的行;第二次循环只能在这个子集里找第二个ESN的行,大概率没有匹配结果,数据框变为空,此时赋值FF列就会触发长度不匹配的错误。
解决方案
方案1:基于原始数据循环处理(保留循环逻辑)
不要修改原始数据框,每次循环从原始数据中筛选目标ESN的行,处理后收集结果再合并:
import pandas as pd # 保存原始数据的副本 original_df = df_esn.copy() # 生成去重的ESN列表(修正原代码中可能的笔误,用original_df替代df) esn_list = pd.unique(original_df[['ESN01', 'ESN02']].values.ravel()) # 存储每个ESN处理后的结果 result_dfs = [] for esn in esn_list: # 从原始数据中筛选当前ESN的行 temp_df = original_df[(original_df['ESN01'] == esn) | (original_df['ESN02'] == esn)] # 生成FF列 temp_df['FF'] = temp_df.apply(lambda row: row['DFFB1'] if row['ESN01'] == esn else row['DFFB2'], axis=1) # 将结果加入列表 result_dfs.append(temp_df) # 合并所有结果为最终数据框 final_df = pd.concat(result_dfs, ignore_index=True)
方案2:无需循环,向量化一次性处理(更高效)
如果需求是为原始数据的每一行,根据该行的ESN01/ESN02匹配情况生成FF列(无需按ESN拆分),可以直接用numpy.where实现向量化操作,避免逐行循环和apply:
import numpy as np # 针对单个目标ESN(示例中的26019) target_esn = 26019 df_esn['FF'] = np.where(df_esn['ESN01'] == target_esn, df_esn['DFFB1'], df_esn['DFFB2']) # 针对所有ESN,自动匹配每行对应的FF值 df_esn['FF'] = np.where(df_esn['ESN01'].isin(esn_list), df_esn['DFFB1'], df_esn['DFFB2'])
关键说明
- 方案1保留了原有的循环逻辑,但避免了修改原始数据导致的筛选范围缩小问题;
- 方案2利用pandas/numpy的向量化特性,比逐行
apply和循环更高效,适合大数据量场景。
内容的提问来源于stack exchange,提问作者Brom
相关产品推荐
相关产品推荐

