如何构建Pandas混合层级MultiIndex DataFrame适配非对称层级表格
Pandas非对称层级表构建方案
你可以通过同时设置行多层索引和列多层索引实现需求,完整实现代码如下:
import pandas as pd # 原始数据定义 df1 = pd.DataFrame([['a', 1, 6,], ['b', 2, 3,]], columns=['Name', 'Mean', 'Var']).set_index('Name') df2 = pd.DataFrame([['a', 'x', +1,], ['a', 'y', -1,], ['b', 'x', -2,], ['b', 'y', 1,]], columns=['Name', 'Orientation', 'W']).set_index(['Name', 'Orientation']) # 构造两层列索引,匹配你的分类需求 df1.columns = pd.MultiIndex.from_tuples([('V', 'Mean'), ('V', 'Var')]) df2.columns = pd.MultiIndex.from_tuples([('W', '')]) # 按Name索引关联两个表,df1的V类数据会自动广播到对应Name的所有Orientation行 df = df2.join(df1, on='Name') # 可选优化:如果不需要V类数据重复显示,可执行以下代码将非首行的V值设为空,不影响索引取值逻辑 # df.loc[df.groupby(level='Name').cumcount() > 0, [('V', 'Mean'), ('V', 'Var')]] = pd.NA
效果验证
- 执行
df.loc['a']['V','Mean']返回结果为1,符合要求 - 执行
df.loc['a','y']['W']返回结果为-1,符合要求
结构说明
- 行索引为两层MultiIndex:一级为
Name,二级为Orientation,匹配你设定的层级分类规则 - 列索引为两层MultiIndex:一级分为
V和W两个大类,V下包含Mean、Var两个子字段,W无次级字段,适配非对称的列结构 - V类字段天然仅和
Name关联,合并时自动按Name匹配到所有对应子行,无需额外维护关联关系
内容的提问来源于stack exchange,提问作者Hojin Cho
相关产品推荐
相关产品推荐

