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

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)
问题分析与修复方案

核心错误点

  1. 匹配逻辑完全错误:原代码用(A and B and C) == (X and Y and Z)的方式判断匹配,这在Python中是对三个字段的逻辑与结果进行比较,而非逐个字段对比。比如当A非空时A and B and C会返回C的值,和另一边的结果对比完全不符合预期,导致大量匹配项被误判。
  2. 主用户数据初始状态不合理:初始化为空字典,若第一个遇到的是普通用户,会用空值去匹配,直接跳过;后续若主用户数据未更新,也会导致错误匹配。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:25:31