如何将Pandas多行按列值聚合并扩展为带自定义命名新列的单行
Pandas 长表转宽表高效实现方案
你要实现的是典型的长表转宽表操作,无需自定义循环,用Pandas原生向量化方法即可实现,性能远高于循环写法。
核心实现代码
首先构造示例输入DataFrame:
import pandas as pd df = pd.DataFrame({ 'customer': ['Jack', 'Jack', 'Jane', 'Jane'], 'device': ['M', 'D', 'M', 'D'], 'x': [1,4,7,10], 'y': [2,5,8,11], 'z': [3,6,9,12] })
方法1:用pivot实现(无重复分组场景)
如果同一个customer+device组合只有唯一一行数据,直接用pivot即可:
# 按customer为行索引,device为列维度展开x/y/z三个值列 res = df.pivot(index='customer', columns='device', values=['x', 'y', 'z']) # 拼接列名,生成你需要的x_M/y_M这类格式 res.columns = [f"{val_col}_{device}" for val_col, device in res.columns] # 重置索引,将customer从索引转为普通列 res = res.reset_index()
方法2:用pivot_table实现(有重复分组场景)
如果同一个customer+device组合存在多行数据,需要指定聚合规则(比如求和、取均值等),可以用pivot_table:
# aggfunc参数可根据需求替换为'mean'/'max'/'min'等聚合函数 res = df.pivot_table( index='customer', columns='device', values=['x', 'y', 'z'], aggfunc='sum' ) res.columns = [f"{val_col}_{device}" for val_col, device in res.columns] res = res.reset_index()
两种方法得到的输出结果和你要求的格式完全一致:
customer x_M x_D y_M y_D z_M z_D 0 Jack 1 4 2 5 3 6 1 Jane 7 10 8 11 9 12
如果需要调整列的顺序,只需要对res的columns属性重新排序即可。
内容的提问来源于stack exchange,提问作者jgk_iles
相关产品推荐
相关产品推荐

