5

私の最初の質問への回答のおかげで、私は今、私が望む方法でマルチインデックスされたDataFrameを持っています。データ構造にデータが入ったので、それを取り出して、これを行うためのより良い方法があるかどうか疑問に思っています。私の2つの問題は関連していますが、別々の「理想的な」解決策があるかもしれません。

サンプル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つのインデックスディメンションのみがダウンするようにしたいと思います。つまり、リードタイム列を持つ2つのDataFrameをiteritems返して生成する動作です。[('IWWGCW', df['IWWGCW']), ('IWWGDW', df['IWWGDW'])]私のブルートフォースソリューションは、基本的にを実行するラッパールーチンを使用すること[(key, df[key] for key in df.columns.levels[0]]です。これを行うためのより良い方法はありますか?

申し込み

また、「他のすべての人からIWWGDWエントリを減算する」などのことを実行して、対の差を計算したいと思います。私はやろうとしましたが、使用するかどうかに関係なくdf.apply(lambda f: f - df['IWWGDW'])取得します。上記の反復回避策を使用して新しいDataFrameを再構築しようとしましたが、物事をブルートフォースするときは常に心配しています。この種の計算を行うためのより「パンダシック」な方法はありますか?KeyError: ('IWWGDW', 'occurred at index 2010-11-26 12:00:00')axis=1axis=0

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これにより、基になるレベルのが正しく返されます

于 2017-11-21T18:48:00.707 に答える