You need to enable JavaScript to run this app. Pandas按多列分组将porcentaje列转为min-max格式并处理CSV
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按多列分组将porcentaje列转为min-max格式并处理CSV

Pandas 分号分隔CSV分组取最小最大值拼接实现

之前试写的代码没出效果,核心是三个实操层面的问题:

  • 链式调用中断:单独写df.groupby(...)只是生成GroupBy对象,没有把返回值赋值给变量,后续的agg、transform操作还是作用在原始未分组的DataFrame上,完全没有生效
  • 聚合逻辑不匹配:你需要的是每个分组只保留1行汇总值,但transform的输出形状和原始DataFrame完全一致,会保留所有原始行,不会生成汇总结果;且lambda x: '-'.join(x)是把分组内所有原始值按出现顺序拼接,既不会取最小最大值,也不会按升序排列
  • 文件解析参数遗漏:你的文件是分号;分隔的,pandas默认按逗号读取,第一步就会解析错乱

完整可运行实现流程

  1. 正确读取分号分隔的CSV文件
    必须显式指定分隔符为分号,否则列解析完全错误:
    import pandas as pd
    import numpy as np
    
    # 替换为你本地的输入文件路径
    df = pd.read_csv("input.csv", sep=';')
    
  2. 按维度分组聚合取最小、最大值
    加sort=False参数可保留分组首次出现的顺序,避免行序和预期不符:
    grouped_df = df.groupby(
        ['zona', 'rango', 'nombre'],
        as_index=False,
        sort=False
    )['porcentaje'].agg(
        min_val=np.min,
        max_val=np.max
    )
    
  3. 拼接成要求的「最小值-最大值」格式
    把两个数值列转成字符串后用-拼接,替换原有porcentaje列,删掉临时计算列:
    grouped_df['porcentaje'] = grouped_df['min_val'].astype(str) + '-' + grouped_df['max_val'].astype(str)
    final_df = grouped_df[['zona', 'rango', 'nombre', 'porcentaje']]
    
  4. 结果写回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 23:15:03