7

Pythonpandasパッケージの階層インデックスに苦労しています。具体的には、データがピボットされた後に行のデータ をフィルタリングして比較する方法がわかりません。

ドキュメントの例のテーブルは次のとおりです。

import pandas as pd
import numpy as np

In [1027]: df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6,
                              'B' : ['A', 'B', 'C'] * 8,
                              'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
                              'D' : np.random.randn(24),
                              'E' : np.random.randn(24)})

In [1029]: pd.pivot_table(df, values='D', rows=['A', 'B'], cols=['C'])
Out[1029]: 
    C             bar       foo
    A     B                    
    one   A -1.154627 -0.243234
          B -1.320253 -0.633158
          C  1.188862  0.377300
    three A -1.327977       NaN
          B       NaN -0.079051
          C -0.832506       NaN
    two   A       NaN -0.128534
          B  0.835120       NaN
          C       NaN  0.838040

以下のように分析したい。

1) 列属性でこのテーブルをフィルタリングします。たとえば、負の行を選択しますfoo

    C             bar       foo
    A     B                    
    one   A -1.154627 -0.243234
          B -1.320253 -0.633158
    three B       NaN -0.079051
    two   A       NaN -0.128534

B2)異なるA系列グループ間で残りの系列値を比較しますか? この情報にアクセスする方法がわかりません:{'one':['A','B'], 'two':['A'], 'three':['B']}どの系列B値が各キーに固有であるか、または複数のキー グループで見られるかなどを判断します。

これをピボット テーブル構造内で直接行う方法はありpandas dataframeますか?

更新: このコードは正しい方向への一歩だと思います。少なくとも、このテーブル内の個々の値にアクセスできますが、まだ系列の値をハードコーディングしています。

table = pivot_table(df, values='D', rows=['A', 'B'], cols=['C'])
table.ix['one', 'A']
4

2 に答える 2

11

ピボット テーブルは DataFrame を返すため、次のようにして簡単にフィルター処理できます。

In [15]: pivoted = pivot_table(df, values='D', rows=['A', 'B'], cols=['C'])

In [16]: pivoted[pivoted.foo < 0]
Out[16]: 
C             bar       foo
A     B                    
one   A -0.412628 -1.062175
three B       NaN -0.562207
two   A       NaN -0.007245

次のようなものを使用できます

pivoted.ix['one']

すべての A シリーズ グループを選択するには

また

pivoted.ix['one', 'A']

異なる A および B シリーズ グループを選択するには

于 2012-08-15T19:47:23.257 に答える