Python CSV数据重复问题:变电站回路最大值提取结果重复
问题描述
处理CSV数据时,需求如下:
- 读取第二列为变电站名称的CSV文件
- 根据输入筛选目标变电站的数据
- 针对该变电站的每个回路(示例:[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")
问题原因分析
- 缩进错误:原代码中
resultados.append(combinado)位于for循环外部,仅最后一个回路的处理结果会被添加到总结果中,前序回路数据丢失 - 重复行未去重:当某一回路的最后一列最大值与倒数第二列最大值出现在同一行时,
pd.concat会重复添加该行,导致回路条目重复 - 循环逻辑缺失:未在循环内逐个添加回路结果,导致数据处理不完整
解决方案
修改代码如下,修复缩进并添加去重逻辑:
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
相关产品推荐
相关产品推荐

