You need to enable JavaScript to run this app. 如何将Pandas多行按列值聚合并扩展为带自定义命名新列的单行
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:51:03