Pandas如何按日期升序将长表转换为多层列索引宽表
你可以通过Pandas的pivot_table结合列层级调整完成这个转换,是目前性能最优、代码最简洁的实现方式:
实现步骤
- 首先将日期字段转换为日期类型,避免字符串排序出现逻辑错误,然后构造透视表:
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)
- 透视并调整列层级顺序
# 生成透视表 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
相关产品推荐
相关产品推荐

