【问题标题】:Reindex 3rd level of Multiindex DataFrame where second-level index is irregular重新索引 Multiindex DataFrame 的第 3 级,其中二级索引不规则
【发布时间】:2018-07-23 20:59:36
【问题描述】:

我想重新索引 DataFrame 的第三级,其中索引的第二级不遵循任何模式。 I need a Multiindex object to reindex a multiindexed DataFrame,但我在构建它时遇到了麻烦。我读过this question,但是Multiindex 遵循一种模式,可以从pd.Multiindex.from_product() 构造。就我而言,第二级依赖于第一级,但不遵循模式。基本上,我只想重用 Multiindex 的前两个级别,即在第三个级别上重新索引。

一个虚构数字的例子(原始DataFrame大约有10,000行长):

df = pd.DataFrame({'Alt':[2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000,
                          4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000],
                   'Mn':[0.235, 0.235, 0.554, 0.554, 0.328, 0.328, 0.764, 0.764,
                         0.245, 0.245, 0.587, 0.587, 0.376, 0.376, 0.802, 0.802],
                   'Fact':[1.2, 1.3, 1.2, 1.3, 1.2, 1.3, 1.2, 1.3,
                           1.2, 1.3, 1.2, 1.3, 1.2, 1.3, 1.2, 1.3], 
                   'Val':[10, 12, 8, 9, 6, 7, 4, 5,
                          9, 11, 7, 8, 5, 6, 3, 4]})
df = df.set_index(['Alt', 'Mn', 'Fact'])
df
                 Val
Alt  Mn    Fact     
2000 0.235 1.2    10
           1.3    12
     0.554 1.2     8
           1.3     9
     0.328 1.2     6
           1.3     7
     0.764 1.2     4
           1.3     5
4000 0.245 1.2     9
           1.3    11
     0.587 1.2     7
           1.3     8
     0.376 1.2     5
           1.3     6
     0.802 1.2     3
           1.3     4

我想要的解决方案如下所示:

new_facts = [1.2, 1.25, 1.3]
df = df.reindex(new_facts, level='Fact')
df
                 Val
Alt  Mn    Fact     
2000 0.235 1.2    10
           1.25   NaN
           1.3    12
     0.554 1.2     8
           1.25   NaN
           1.3     9
     0.328 1.2     6
           1.25   NaN
           1.3     7
     0.764 1.2     4
           1.25   NaN
           1.3     5
4000 0.245 1.2     9
           1.25   NaN
           1.3    11
     0.587 1.2     7
           1.25   NaN
           1.3     8
     0.376 1.2     5
           1.25   NaN
           1.3     6
     0.802 1.2     3
           1.25   NaN
           1.3     4

最终目标是对Val 列进行插值。


编辑

正如this question 的回答中所述,reindex 函数应该接受一个级别参数(就像我在上面的“所需解决方案”中一样),但由于某种原因,这不起作用并且输出 DataFrame 保持不变.

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    上周我有一个类似的问题(请参阅Upsample in pandas multi-index):

    如果您按照描述使用 df,您可以执行以下操作:

    def reindex_df(x, vals):
      lvl0 = x.index.get_level_values(0)[0]
      lvl1 = x.index.get_level_values(1)[0]
      lvl2 = x.index.get_level_values(2)
      lvl2 = np.unique(np.concatenate((np.array(lvl2), np.array(vals))))
    
      mux = pd.MultiIndex.from_product([[lvl0], [lvl1], lvl2 ], names=x.index.names)
      return (x.reindex(mux))
    
    df.groupby(level=[0, 1], group_keys=False).apply(reindex_df, [1.2, 1.25, 1.3])
    

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 2020-06-05
      • 2016-11-28
      • 2021-03-27
      • 2020-05-19
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      相关资源
      最近更新 更多