Pandas按多列分组将porcentaje列转为min-max格式并处理CSV
Pandas 分号分隔CSV分组取最小最大值拼接实现
之前试写的代码没出效果,核心是三个实操层面的问题:
- 链式调用中断:单独写
df.groupby(...)只是生成GroupBy对象,没有把返回值赋值给变量,后续的agg、transform操作还是作用在原始未分组的DataFrame上,完全没有生效 - 聚合逻辑不匹配:你需要的是每个分组只保留1行汇总值,但
transform的输出形状和原始DataFrame完全一致,会保留所有原始行,不会生成汇总结果;且lambda x: '-'.join(x)是把分组内所有原始值按出现顺序拼接,既不会取最小最大值,也不会按升序排列 - 文件解析参数遗漏:你的文件是分号
;分隔的,pandas默认按逗号读取,第一步就会解析错乱
完整可运行实现流程
- 正确读取分号分隔的CSV文件
必须显式指定分隔符为分号,否则列解析完全错误:import pandas as pd import numpy as np # 替换为你本地的输入文件路径 df = pd.read_csv("input.csv", sep=';') - 按维度分组聚合取最小、最大值
加sort=False参数可保留分组首次出现的顺序,避免行序和预期不符:grouped_df = df.groupby( ['zona', 'rango', 'nombre'], as_index=False, sort=False )['porcentaje'].agg( min_val=np.min, max_val=np.max ) - 拼接成要求的「最小值-最大值」格式
把两个数值列转成字符串后用-拼接,替换原有porcentaje列,删掉临时计算列:grouped_df['porcentaje'] = grouped_df['min_val'].astype(str) + '-' + grouped_df['max_val'].astype(str) final_df = grouped_df[['zona', 'rango', 'nombre', 'porcentaje']] - 结果写回CSV文件
写出时同样指定分号分隔,不保留无意义的行索引,避免文件多出一列多余内容:final_df.to_csv( "output.csv", sep=';', index=False, encoding='utf-8' )
输出校验
跑通后生成的文件内容和你提供的样例完全匹配:
zona;rango;nombre;porcentaje Yermo de Agujas;Rango Alto;Hueso monstruo pequeño;23-45 Yermo de Agujas;Rango Alto;Hueso escogido;30-40 Yermo de Agujas;Rango Alto;Hueso fósil;20-30 Yermo de Agujas;Rango Alto;Reliquia de dracohueso;5-7
内容的提问来源于stack exchange,提问作者Kelfindel
相关产品推荐
相关产品推荐

