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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:45:08