You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何按日期升序将长表转换为多层列索引宽表

你可以通过Pandas的pivot_table结合列层级调整完成这个转换,是目前性能最优、代码最简洁的实现方式:

实现步骤

  1. 首先将日期字段转换为日期类型,避免字符串排序出现逻辑错误,然后构造透视表:
import pandas as pd

# 构造示例DataFrame,实际使用时替换为你自己的df即可
data = [
    [1, 'abc', 'def', '12-09-21', 'a', 100.01, 109],
    [2, 'xyz', 'wer', '13-09-21', 'b', 45, 51],
    [1, 'xyz', 'def', '14-09-21', 'b', 34, 100],
    [1, 'abc', 'def', '13-09-21', 'a', 50, 60],
    [1, 'abc', 'def', '14-09-21', 'a', 45, 10]
]
df = pd.DataFrame(data, columns=['id', 'name1', 'name2', 'date', 'type', 'usage1', 'usage2'])

# 转换日期格式,注意你的日期是日-月-年格式,所以加dayfirst参数
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
  1. 透视并调整列层级顺序
# 生成透视表
pivot_df = df.pivot_table(
    index=['id', 'name1', 'name2', 'type'], # 固定为行的维度
    columns='date', # 上层列索引
    values=['usage1', 'usage2'], # 下层列指标
    aggfunc='first' # 同一分组仅一条数据时直接取第一个值即可
)

# 交换列层级,把日期放到上层、usage指标放到下层,符合你的输出要求
pivot_df = pivot_df.swaplevel(0, 1, axis=1)

# 按日期升序排列所有列
pivot_df = pivot_df.sort_index(axis=1, level=0)

# 可选操作:把日期格式转回你需要的字符串格式
pivot_df.columns = pivot_df.columns.set_levels(pivot_df.columns.levels[0].strftime('%d-%m-%y'), level=0)

# 可选操作:把行索引转为普通列,和你给出的输出结构完全一致
pivot_df = pivot_df.reset_index()

方案优势

全程使用Pandas原生向量化操作,性能远优于手动遍历拼接的实现方式,逻辑清晰不易出错。如果后续遇到同一(id、name1、name2、type、date)组合下有多条数据的场景,仅需要调整aggfunc参数即可,比如求和用sum、求均值用mean,扩展性很强。


内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:39:04