求助:创建含三级列的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
相关产品推荐
相关产品推荐

