如何使用pandas pivot_table按instance.task_id.number分组拆分单列生成多列
问题核心原因
你代码的报错是因为aggfunc参数使用错误:aggfunc接收的是聚合运算规则(比如first、sum这类运算逻辑),不能直接传入字段名。
简化示例的实现方案
你给出的小示例可以通过先给分组内行加序号,再做透视表实现,代码如下:
import pandas as pd df = pd.DataFrame([["A", 2], ["A", 3], ["A", 6], ["B", 10], ["B", 11], ["B", 12]], columns=["id", "val"]) # 给每个id分组内的行生成序号,作为后续列名后缀 df["col_seq"] = df.groupby("id").cumcount() + 1 # 透视生成宽表 df2 = df.pivot_table(index="id", columns="col_seq", values="val", aggfunc="first").reset_index() # 重命名列名,符合业务语义 df2.columns = ["id"] + [f"metric_question_{i}" for i in df2.columns[1:]]
运行后即可得到你期望的每个id一行,不同取值拆分多列的结构。
真实业务代码调整方案
你的需求是每个instance.task_id.number对应一行,每个metric.question的取值作为单独列,调整后代码如下:
import pandas as pd # 读取原始数据 stockage = pd.read_csv(r"C:\Users\vion1\Ele\Engie\Import_Engie\asmt_assessment_instance_question.csv", encoding="cp1252") df = pd.DataFrame(stockage) # 生成透视表 df2 = df.pivot_table( # 按task_id分组,每行对应一个task_id index=['instance.task_id.number'], # 按metric.question拆分列,每个不同的question对应一组列 columns='metric.question', # 需要保留的其他字段(注意不要把index里的task_id重复放到values里) values=[ "instance","instance.trigger_id","instance.taken_on","instance.state", "string_value","metric.order","value","sys_updated_on","instance.task_id.company", "instance.user.u_company_customer.u_customer_trigram","instance.task_id.contact_type", "instance.task_id.assignment_group" ], # 聚合规则:同一组合下取第一个值即可,无重复数据时不影响结果 aggfunc="first" # 把index的task_id还原为普通列 ).reset_index() # 可选操作:合并多层列名,避免导出csv后列名可读性差 df2.columns = [f"{col[0]}_{col[1]}" if col[1] != "" else col[0] for col in df2.columns] print(df2) # 导出时关闭索引列,用utf-8-sig编码避免中文乱码 df2.to_csv(r"C:\Users\vion1\Ele\Engie\Import_Engie\resultat.csv", index=False, encoding="utf-8-sig")
提示:如果同一个
instance.task_id.number+metric.question组合下存在多个不同的其他字段值,可以把aggfunc替换为自定义函数,比如aggfunc=lambda x: ','.join(x.dropna().astype(str)),把多个值合并为逗号分隔的字符串,避免丢失数据。
内容的提问来源于stack exchange,提问作者SRP
相关产品推荐
相关产品推荐

