从2级MultiIndex转换为3级MultiIndex

时间:2017-04-24 09:03:59

标签: python pandas

我有以下数据结构:

               foo  year
par  chi                
10.0 900  0.024096  1983
     901  0.200000  1983
     902  0.300000  1983
     900  0.027473  1984
     901  0.023256  1984
     902  0.400000  1984
     900  0.018182  1985

也就是说,对于每个父母 - 孩子 - 年组合,我对foo有一些观察。现在,对于每个父级,我想计算每个chi和彼此之间chi(在此数据集中,900和901)之间的协方差,即随时间的变化(即,{的条目对于给定的foochi_1chi_2随时间变化{1}}。

我认为“最简单”的方法是将par第二次作为第三级索引引入数据集,但我得到的只是:

chi

其中index = pd.MultiIndex.from_product([par, chi, chi]) par是索引的唯一值。但是,我找不到一种方法来重新索引我的数据,以一种对练习有用的方式。我该如何处理?

1 个答案:

答案 0 :(得分:2)

解决方案计划:

  • 从包含四列的数据框开始(必要时重置索引)
  • 为每个par组应用计算子协方差的函数
  • 在函数unstack组中,使其索引为year,每个子项的foo值位于不同的列中
  • 计算协方差并融合结果,以便每chichi_other组合获得一行。

示例:

df = pd.DataFrame({'chi': [900, 901, 902, 900, 901, 902, 900],
 'foo': [0.024096, 0.2, 0.3, 0.027473, 0.023256, 0.4, 0.018182],
 'par': [10, 10, 10, 10, 10, 10, 10],
 'year': [1983, 1983, 1983, 1984, 1984, 1984, 1985]})

def child_covariances(group):
    x = group.set_index(['year','chi'])['foo'].unstack()
    x = pd.melt(x.cov().reset_index(), id_vars=['chi'], 
                var_name='chi_other', value_name='foo_cov')\
          .set_index(['chi','chi_other'])\
          .query('chi <= chi_other').sort_index()
    return x

res = df.groupby('par').apply(child_covariances)
#                     foo_cov
# par chi chi_other          
# 10  900 900        0.000022
#         901       -0.000298
#         902        0.000169
#     901 901        0.015619
#         902       -0.008837
#     902 902        0.005000