如何通过pd.MultiIndex.from_product生成扁平结构的三级MultiIndex
解决MultiIndex.from_product生成嵌套元组索引的问题
你当前的代码用pd.MultiIndex.from_product将terms和嵌套元组列表tuples组合,得到的是二级索引(第二级为嵌套元组),但实际需要的是三级扁平索引(每个索引元素为(Term, Category, Subcategory)形式的三元组),可以通过以下两种方法解决:
方法1:拆分维度后直接生成三级笛卡尔积
将原tuples拆分为两个独立的维度列表,再和terms一起传入from_product,直接生成三级扁平索引:
import pandas as pd terms = ['2021C', '2022A', '2020C', '2021A', '2019A', '2019B', '2019C', '2020A', '2021B', '2020B'] tuples = [('Academic Info','Degree'), ('Academic Info','Major'), ('Demographic Info','Military'), ('Demographic Info','Army') ] # 拆分嵌套元组为两个独立维度 categories = [item[0] for item in tuples] subcategories = [item[1] for item in tuples] # 生成三级扁平MultiIndex multiindex = pd.MultiIndex.from_product( [terms, categories, subcategories], names=['Term', 'Category', 'Subcategory'] )
方法2:展开已生成的嵌套索引
如果不想拆分原tuples,可以先生成二级嵌套索引,再将嵌套元组展开为扁平三元组,重新构造MultiIndex:
import pandas as pd terms = ['2021C', '2022A', '2020C', '2021A', '2019A', '2019B', '2019C', '2020A', '2021B', '2020B'] tuples = [('Academic Info','Degree'), ('Academic Info','Major'), ('Demographic Info','Military'), ('Demographic Info','Army') ] # 先生成带嵌套元组的二级索引 temp_index = pd.MultiIndex.from_product([terms, tuples], names=['Term', '_']) # 展开嵌套元组为扁平三元组 flat_index_tuples = [(term, cat, subcat) for term, (cat, subcat) in temp_index] # 生成目标三级MultiIndex multiindex = pd.MultiIndex.from_tuples(flat_index_tuples, names=['Term', 'Category', 'Subcategory'])
两种方法最终生成的索引结构一致,示例输出如下:
MultiIndex([('2021C', 'Academic Info', 'Degree'), ('2021C', 'Academic Info', 'Major'), ('2021C', 'Demographic Info', 'Military'), ...], names=['Term', 'Category', 'Subcategory'])
内容的提问来源于stack exchange,提问作者Flying Spaghetti
相关产品推荐
相关产品推荐

