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

Python CSV数据重复问题:变电站回路最大值提取结果重复

问题描述

处理CSV数据时,需求如下:

  1. 读取第二列为变电站名称的CSV文件
  2. 根据输入筛选目标变电站的数据
  3. 针对该变电站的每个回路(示例:[25-501,25-502]),分别提取最后一列最大值所在行和倒数第二列最大值所在行

运行提供的代码后,结果中回路条目重复出现(如[25-501,25-502,25-501,25-502]),需要解决该重复问题。

原代码如下:

if df_filtrado.empty:
    print("No se encontró información para la subestación especificada.")
    continue
    
else:
    subestacion_df = df_filtrado

    # Obtiene los ítems únicos de la tercera columna
    items = subestacion_df.iloc[:, 2].unique()

    for item in items:

        # Filtra por el ítem en la tercera columna
        item_df = subestacion_df[subestacion_df.iloc[:, 2] == item]

        # Encuentra el máximo de la última columna
        max_ultima_columna = item_df.iloc[:, -1].max()

        # Encuentra el máximo de la penúltima columna
        max_penultima_columna = item_df.iloc[:, -2].max()

        # Encuentra la fila que contiene el máximo de la última columna
        fila_max_ultima = item_df[item_df.iloc[:, -1] == max_ultima_columna]

        # Encuentra la fila que contiene el máximo de la penúltima columna
        fila_max_penultima = item_df[item_df.iloc[:, -2] == max_penultima_columna]

        # Combina ambas filas
        combinado = pd.concat([fila_max_ultima, fila_max_penultima])

    # Pone todo en el archivo resultados
    resultados = resultados.append(combinado, ignore_index=True)

################################################################################
### Guarda el archivo por mes
################################################################################

    # Guardar la tabla en un archivo del mes
    archivo_resultado = os.path.join(f'{ubicacion}/{subcarpeta}', f"Máximo - {subcarpeta} - {resultados.iloc[1, 1]}.csv")
    resultados.to_csv(archivo_resultado, sep=';', decimal=',', index=False)
    print(f"Se ha guardado la información del mes {subcarpeta} en {archivo_resultado} \n")
问题原因分析
  1. 缩进错误:原代码中resultados.append(combinado)位于for循环外部,仅最后一个回路的处理结果会被添加到总结果中,前序回路数据丢失
  2. 重复行未去重:当某一回路的最后一列最大值与倒数第二列最大值出现在同一行时,pd.concat会重复添加该行,导致回路条目重复
  3. 循环逻辑缺失:未在循环内逐个添加回路结果,导致数据处理不完整
解决方案

修改代码如下,修复缩进并添加去重逻辑:

if df_filtrado.empty:
    print("未找到指定变电站的信息。")
    continue
    
else:
    subestacion_df = df_filtrado

    # 获取第三列的唯一回路条目
    items = subestacion_df.iloc[:, 2].unique()

    for item in items:
        # 筛选当前回路的数据
        item_df = subestacion_df[subestacion_df.iloc[:, 2] == item]

        # 计算最后一列和倒数第二列的最大值
        max_ultima = item_df.iloc[:, -1].max()
        max_penultima = item_df.iloc[:, -2].max()

        # 获取对应最大值的行
        fila_ultima = item_df[item_df.iloc[:, -1] == max_ultima]
        fila_penultima = item_df[item_df.iloc[:, -2] == max_penultima]

        # 合并两行并去重(避免同一行重复添加)
        combinado = pd.concat([fila_ultima, fila_penultima]).drop_duplicates(ignore_index=True)

        # 将当前回路的结果添加到总结果中(移入循环内)
        resultados = resultados.append(combinado, ignore_index=True)

################################################################################
### 按月份保存文件
################################################################################

    # 生成保存路径
    archivo_resultado = os.path.join(f'{ubicacion}/{subcarpeta}', f"Máximo - {subcarpeta} - {resultados.iloc[1, 1]}.csv")
    # 保存CSV,使用分号分隔、逗号作为小数位
    resultados.to_csv(archivo_resultado, sep=';', decimal=',', index=False)
    print(f"已将{subcarpeta}月的信息保存至{archivo_resultado} \n")
额外说明
  • 若需求是每个回路仅保留一行(优先取某一列最大值的行),drop_duplicates已自动处理重复行
  • 若需明确保留两行(即使回路字段重复,但对应不同列的最大值),可删除.drop_duplicates(ignore_index=True),此时回路条目重复为正常现象,需确认需求是否符合

内容的提问来源于stack exchange,提问作者Jose L Gutierrez A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:07:43