首页 > 解决方案 > 生成不同长度的MultiIndex DataFrame

问题描述

我需要从给定的数据初始化一个 multiIndex DataFrame。

id = ['a','b','c']; days = [2,5,4],这意味着,每个id都有其对应的天数,即'a'有第1,2天;'b' 有第 1,..,5 天;'c' 有第 1 天,...第 4 天。换句话说,每个 id 的日子都不同。

并且每天有 4 个时段,prd = [0,1,2,3]. 我期望的是,在每一天和每一时期,每个 id 都有一个 DataFrame 的 MultiIndex。

   MultiIndex([('a',1,0),
               ('a',1,1),
               ('a',1,2),
               ('a',1,3),
               ('a',2,0),
               ('a',2,1),
               ('a',2,2),
               ('a',2,3),
               ('b',1,0),
               ('b',1,1),
               ('b',1,2),
               ...
               ('b',5,1),
               ('b',5,2),
               ('b',5,3),
               ('c',1,0),
               ('c',1,1),
               ('c',1,2),
               ...
               ('c',4,1),
               ('c',4,2),
               ('c',4,3),
],
names=['id','day','prd']
)

我尝试在python中处理:因为不同id的天数不同,所以我通过循环和列表推导生成了两个完整的id和天数列表,然后将zip它们组合在一起以获得元组对。然后我使用itertools.product()与句号结合。但我得到的是

   [(('a',1),0),
    (('a',1),1),
    (('a',1),2),....] 

如果我使用pd.MultiIndex.from_product(),我会得到类似的结果,前两个索引在一个组中,第三个索引是分开的。

既然product这两种方式都无济于事,旧的时尚是也延伸prd到长而完整的列表以匹配其他两个家伙,并立即将它们拉上拉链。

我真的很想知道是否有更好的方法从一开始就生成索引,比这么长的循环、列表理解、zip 和产品组合在一起更好。除了原生 python 数据结构之外,Pandas 中是否有任何东西可以处理这种情况?

非常感谢!

标签: pythonpandasdataframemulti-index

解决方案


使用列表推导式创建组合zip

id = ['a','b','c']
prd = [0,1,2,3]
days = [2,5,4]

result = [(idx, i, p) for d, idx in zip(days, id) for i in range(1, d+1) for p in prd]

print (pd.MultiIndex.from_tuples(result))

MultiIndex([('a', 1, 0),
            ('a', 1, 1),
            ('a', 1, 2),
            ('a', 1, 3),
            ('a', 2, 0),
            ('a', 2, 1),
            ('a', 2, 2),
            ('a', 2, 3),
            ('b', 1, 0),
            ('b', 1, 1),
            ('b', 1, 2),
            ('b', 1, 3),
            ('b', 2, 0),
            ('b', 2, 1),
            ('b', 2, 2),
            ('b', 2, 3),
            ('b', 3, 0),
            ('b', 3, 1),
            ('b', 3, 2),
            ('b', 3, 3),
            ('b', 4, 0),
            ('b', 4, 1),
            ('b', 4, 2),
            ('b', 4, 3),
            ('b', 5, 0),
            ('b', 5, 1),
            ('b', 5, 2),
            ('b', 5, 3),
            ('c', 1, 0),
            ('c', 1, 1),
            ('c', 1, 2),
            ('c', 1, 3),
            ('c', 2, 0),
            ('c', 2, 1),
            ('c', 2, 2),
            ('c', 2, 3),
            ('c', 3, 0),
            ('c', 3, 1),
            ('c', 3, 2),
            ('c', 3, 3),
            ('c', 4, 0),
            ('c', 4, 1),
            ('c', 4, 2),
            ('c', 4, 3)],
           )

推荐阅读