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

求助:创建含三级列的Pandas DataFrame(二级列下嵌套三级列)

解决方案

原代码的核心问题在于:

  • 将日期转为字符串导致排序逻辑错误,丢失了日期的时序特性
  • 扁平化列名破坏了Excel表格的多级表头结构
  • 缺失值填充为空字符串导致数值列类型异常

以下是修正后的代码,完全匹配你想要的Excel表格结构:

import pandas as pd

# 转换为datetime类型,保证日期按时序正确排序
data_df['Transaction Date'] = pd.to_datetime(data_df['Transaction Date'])

# 从Bin列提取Aisle
data_df['Aisle'] = data_df['Bin'].str[0]

# 按Aisle、User、日期分组,计算Count和Qty
by_Aisle = data_df.groupby(['Aisle', 'User', 'Transaction Date']).agg(
    Count=('Product', 'size'),
    Qty=('Qty', lambda x: x.abs().sum())
).reset_index()
by_Aisle = by_Aisle.rename(columns={'Transaction Date': 'Date'})

# 透视生成多级表头,保留层级结构,缺失值填充为0
by_Aisle = by_Aisle.pivot_table(
    index='User',
    columns=['Date', 'Aisle'],
    values=['Count', 'Qty'],
    fill_value=0
)

# 调整列层级顺序:Date → Aisle → 指标(Count/Qty),匹配Excel表头结构
by_Aisle = by_Aisle.swaplevel(0, 1, axis=1).swaplevel(1, 2, axis=1)

# 按日期升序、Aisle字母顺序排序列
by_Aisle = by_Aisle.sort_index(axis=1, level=[0,1])

# 重置索引名称
by_Aisle.index.name = 'User'

关键修改说明:

  • 日期处理:用pd.to_datetime替代astype(str),避免字符串排序的逻辑错误(比如"2024-10-10"会错误排在"2024-10-2"之前)
  • 多级表头保留:不再扁平化列名,通过swaplevel调整层级顺序,让日期作为一级表头,每个日期下对应各Aisle的Count和Qty
  • 缺失值处理:用0填充空值,保证数值列类型统一,便于后续统计计算
  • 列排序:通过sort_index实现日期和Aisle的双重排序,让表头顺序更规整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:22:57