Pandas DataFrame迭代时部分行被跳过的问题排查
问题描述
需要遍历已整理好的Pandas DataFrame,找出拥有对应主用户的普通用户——当指定的三个键(Nome titular、Id Plano de Benefícios、Id Contratado)匹配时,判定该普通用户存在主用户。但当前代码在迭代过程中部分行被跳过,生成的列表中途停止,大量符合匹配条件的行未被处理。
原代码如下:
dataframe = gf.read_excel_base(path, sheet_name) organized_dataframe = gf.organize_dataframe(dataframe) main_user_data = { 'Nome titular': '', 'Nome beneficiário': '', 'Id Plano de Benefícios': '', 'Id Contratado': '' } user_data = { 'Nome titular': '', 'Nome beneficiário': '', 'Id Plano de Benefícios': '', 'Id Contratado': '' } main_user_list = [] user_list = [] for i, a in enumerate(organized_dataframe['Id Contratado']): if gf.is_main_user(organized_dataframe, i): main_user_data = gf.user_to_dict(organized_dataframe, i) else: user_data = gf.user_to_dict(organized_dataframe, i) print(user_data['Nome beneficiário']) if (main_user_data['Nome titular'] and main_user_data['Id Plano de Benefícios'] and main_user_data['Id Contratado']) == (user_data['Nome titular'] and user_data['Id Plano de Benefícios'] and user_data['Id Contratado']): print('deu match') main_user_list.append(main_user_data['Nome beneficiário']) user_list.append(user_data['Nome beneficiário']) print(user_list)
问题分析与修复方案
核心错误点
- 匹配逻辑完全错误:原代码用
(A and B and C) == (X and Y and Z)的方式判断匹配,这在Python中是对三个字段的逻辑与结果进行比较,而非逐个字段对比。比如当A非空时A and B and C会返回C的值,和另一边的结果对比完全不符合预期,导致大量匹配项被误判。 - 主用户数据初始状态不合理:初始化为空字典,若第一个遇到的是普通用户,会用空值去匹配,直接跳过;后续若主用户数据未更新,也会导致错误匹配。
修正后的代码
dataframe = gf.read_excel_base(path, sheet_name) organized_dataframe = gf.organize_dataframe(dataframe) main_user_list = [] user_list = [] main_user_data = None # 初始化为None,明确无有效主用户状态 for i, _ in enumerate(organized_dataframe['Id Contratado']): if gf.is_main_user(organized_dataframe, i): main_user_data = gf.user_to_dict(organized_dataframe, i) else: user_data = gf.user_to_dict(organized_dataframe, i) print(user_data['Nome beneficiário']) # 先确认存在有效主用户数据 if main_user_data is not None: # 逐个对比需要匹配的字段 is_match = ( main_user_data['Nome titular'] == user_data['Nome titular'] and main_user_data['Id Plano de Benefícios'] == user_data['Id Plano de Benefícios'] and main_user_data['Id Contratado'] == user_data['Id Contratado'] ) if is_match: print('deu match') main_user_list.append(main_user_data['Nome beneficiário']) user_list.append(user_data['Nome beneficiário']) print(user_list)
关键修改说明
- 将
main_user_data初始化为None,处理普通用户前先检查是否存在有效主用户,避免空值干扰 - 修复匹配逻辑,逐个字段对比三个目标键,确保匹配条件符合需求
- 移除了冗余的提前定义
user_data,直接在循环内赋值,简化代码
内容的提问来源于stack exchange,提问作者Matheus de Oliveira
相关产品推荐
相关产品推荐

