感谢我对initial question的回复,我现在有了一个多索引的DataFrame,就像我想要的那样。现在我已经将数据放在数据结构中了,我正试图将其解决,并想知道是否有更好的方法来实现这一点。我的两个问题是相关的,但可能有单独的“理想”解决方案:
示例DataFrame(截断)
Experiment IWWGCW IWWGDW
Lead Time 24 48 24 48
2010-11-27 12:00:00 0.997 0.991 0.998 0.990
2010-11-28 12:00:00 0.998 0.987 0.997 0.990
2010-11-29 12:00:00 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986
迭代
我希望能够循环遍历此DataFrame,其中迭代只会使我只关注1个索引维度,即iteritems
行为将返回[('IWWGCW', df['IWWGCW']), ('IWWGDW', df['IWWGDW'])]
并产生2个带有提前期的DataFrames列。我的强力解决方案是使用基本上[(key, df[key] for key in df.columns.levels[0]]
的包装程序。有更好的方法吗?
应用
我还想做一些事情,比如“从其他人那里减去IWWGDW条目”来计算配对差异。我尝试df.apply(lambda f: f - df['IWWGDW'])
,但无论是否使用KeyError: ('IWWGDW', 'occurred at index 2010-11-26 12:00:00')
或axis=1
,都会获得axis=0
。我尝试使用上面提到的迭代解决方法重建一个新的DataFrame,但是当我暴力破解时我总是担心。是否有更“残酷”的方式来进行这种计算?
答案 0 :(得分:6)
我建议使用groupby进行迭代:
In [25]: for exp, group in df.groupby(level=0, axis=1):
....: print exp, group
....:
IWWGCW Experiment IWWGCW
Lead Time 24 48
2010-11-27 12:00:00 0.997 0.991
2010-11-28 12:00:00 0.998 0.987
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986
IWWGDW Experiment IWWGDW
Lead Time 24 48
2010-11-27 12:00:00 0.998 0.990
2010-11-28 12:00:00 0.997 0.990
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986
但是,我发现这并没有像你想要的那样降低顶级水平。理想情况下,您可以编写如下内容:
df.groupby(level=0, axis=1).sub(df['IWWGCW'])
并且具有成对减法,但由于df['IWWGCW']
会降低级别,因此列名称不会对齐。但这很有效:
In [29]: df.groupby(level=0, axis=1).sub(df['IWWGCW'].values)
Out[29]:
Experiment IWWGCW IWWGDW
Lead Time 24 48 24 48
2010-11-27 12:00:00 0 0 0.001 -0.001
2010-11-28 12:00:00 0 0 -0.001 0.003
2010-11-29 12:00:00 0 0 0.000 0.000
2010-11-30 12:00:00 0 0 0.000 0.000
2010-12-01 12:00:00 0 0 0.000 0.000
我会对此有所了解。
答案 1 :(得分:0)
我知道这已经过时了但是在@WesMcKinney的回答之后,我发现在循环内部发现的最好的黑客只是立即选择它:
for exp, group in df.groupby(level=0, axis=1):
print(group[exp])
Lead Time 24 48
2010-11-27 12:00:00 0.997 0.991
2010-11-28 12:00:00 0.998 0.987
2010-11-29 12:00:00 0.997 0.992
2010-11-30 12:00:00 0.997 0.987
2010-12-01 12:00:00 0.996 0.986
这将正确返回基础级别的DataFrame