5

感谢对我最初问题的回复,我现在拥有了一个我想要的多索引 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 个带有 Lead Time 列的 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=1or axis=0。我已经尝试使用上面确定的迭代解决方法重建一个新的 DataFrame,但是当我暴力破解时我总是担心。有没有更“熊猫”的方式来做这种计算?

4

2 回答 2

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

我会多考虑一下。

于 2012-06-16T17:38:48.187 回答
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正确返回基础级别的 a

于 2017-11-21T18:48:00.707 回答