Pandas按DATE列层级分组转ISO周数时如何保留其他MultiIndex层级
问题描述
- 现有一个带MultiIndex列的DataFrame,列层级包含
YEAR(整数类型)、CAT(字符串/分类类型)、DATE(日期类型)三层 - 需求:将列的
DATE层级按对应ISO周数分组求和,保留其余两个列层级,聚合后DATE层级重命名为WK - 初始实现代码:
df = df.groupby( lambda d: d.isocalendar().week, level='DATE', axis='columns' ).sum() df.columns.rename('WK', inplace=True)
- 运行问题:仅完成了DATE到周数的聚合,其余
YEAR、CAT列层级全部丢失
解决方案
原代码问题出在分组时仅指定了DATE层级作为分组依据,pandas会默认丢弃未参与分组的其他列层级,需要把所有需要保留的列层级都纳入分组键。
假设你的列MultiIndex从上到下的层级顺序为YEAR → CAT → DATE,调整后代码如下:
df = df.groupby( [ lambda col: col[0], # 透传YEAR层级的原值 lambda col: col[1], # 透传CAT层级的原值 lambda col: col[2].isocalendar().week # 将DATE层级值转换为ISO周数 ], axis=1 ).sum() # 重命名列层级,将聚合后对应原DATE位置的层级名改为WK df.columns = df.columns.set_names(names=['YEAR', 'CAT', 'WK'])
适配提示:如果你的列层级顺序和上述假设不一致,只需要调整lambda里的索引序号即可。例如层级顺序为
DATE → YEAR → CAT,则DATE对应的取值为col[0]、YEAR为col[1]、CAT为col[2],同步调整最后set_names里的层级名顺序即可。
内容的提问来源于stack exchange,提问作者alant
相关产品推荐
相关产品推荐

