我有以下数据结构:
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)之间的协方差,即随时间的变化(即,{的条目对于给定的foo
,chi_1
和chi_2
随时间变化{1}}。
我认为“最简单”的方法是将par
第二次作为第三级索引引入数据集,但我得到的只是:
chi
其中index = pd.MultiIndex.from_product([par, chi, chi])
,par
是索引的唯一值。但是,我找不到一种方法来重新索引我的数据,以一种对练习有用的方式。我该如何处理?
答案 0 :(得分:2)
解决方案计划:
par
组应用计算子协方差的函数year
,每个子项的foo
值位于不同的列中chi
和chi_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