2

インデックス ラベルが混在するマルチ インデックス データフレームを使用しています。つまり、最初のレベルには文字列ラベルが含まれ、2 番目と 3 番目のレベルは整数ラベルで、4 番目のレベルのラベルは日付です。データフレームは以下のようになります (master_df)

                                           X1   X2  X3
bucket       Start    Stop       Date           
B1             1       1         1/3/2000   2   2   3
                                 1/4/2000   4   3   3
B1             1       2         1/3/2000   4   2   3
                                 1/4/2000   6   2   2

sub_df を master_df.ix['B1',1,2,:] として取り出し、sub_df でいくつかの操作を行い、同じ場所の master_df に戻します。さまざまな方法を使用して sub_df を取り出すことができますが、それを保存することになると、私が試したすべてのオプションが機能していないようです。この問題は、「整数」ラベル (2 番目と 3 番目のラベル - スタートストップ) に関連していると思います。以下のオプション/方法を試しましたが、成功しませんでした

    sub_df = master_df.ix['B1'].ix[1].ix[2]

    #do some operations on sub_df

    master_df.xs('B1').xs(1).xs(2).update(sub_df)

    master_df.ix['B1'].ix[1].ix[2].update(sub_df)

    merge(master_df.ix['B1',1,2,:],sub_df)

上記の操作はいずれも、master_df の変更を反映していません (エラー メッセージも表示されません)。

それを行う適切な方法を提案できますか?

アップデート :

sub_df と master_df には、sub_df の操作と同じインデックスがなく、日付インデックスのみが必要です。sub_df は以下のようになります。

          X1   X2  X3
Date           
1/3/2000   2   2   3
1/4/2000   4   3   3

私が試したら

sub_df = master_df[master_df.index.get_loc(('B1', 1, 2))]

次のエラーが表示されます-

TypeError: ハッシュできない型: 'numpy.ndarray'

ここでの主な目的は、master_df の小さなチャンクのみを操作し、それらの結果を master_df の元の場所に戻すことです。update メソッドを使用してみましたが、この目的を達成するための他の方法で十分です。

4

5 に答える 5

2

これはあなたの質問を正確に解決するわけではありませんが、これはいくつかのインスピレーションを提供するかもしれません

値を直接設定する方法は次のとおりです

In [75]: df
Out[75]: 
  bucket  start  stop                date  x1  x2  x3
0     B1      1     1 2000-10-03 00:00:00   2   2   3
1     B1      1     1 2000-01-04 00:00:00   4   3   3
2     B1      1     2 2000-01-03 00:00:00   4   2   3
3     B1      1     2 2000-01-04 00:00:00   6   2   2

In [76]: df2 = df.set_index(['bucket','start','stop'])

In [77]: df2
Out[77]: 
                                 date  x1  x2  x3
bucket start stop                                
B1     1     1    2000-10-03 00:00:00   2   2   3
             1    2000-01-04 00:00:00   4   3   3
             2    2000-01-03 00:00:00   4   2   3
             2    2000-01-04 00:00:00   6   2   2

In [78]: df2.ix[('B1',1,2)].ix[:,'x1'] = 5

In [79]: df2
Out[79]: 
                                 date  x1  x2  x3
bucket start stop                                
B1     1     1    2000-10-03 00:00:00   2   2   3
             1    2000-01-04 00:00:00   4   3   3
             2    2000-01-03 00:00:00   5   2   3
             2    2000-01-04 00:00:00   5   2   2

別の方法として、マルチインデックスを持つシリーズを選択し、それを変更してから再度割り当てます (シリーズでのみ機能します)。

In [89]: df2.ix[:,'x1']
Out[89]: 
bucket  start  stop
B1      1      1       2
               1       4
               2       4
               2       6
Name: x1, dtype: int64

In [90]: new_s = df2.ix[:,'x1'].copy()

In [91]: new_s
Out[91]: 
bucket  start  stop
B1      1      1       2
               1       4
               2       4
               2       6
Name: x1, dtype: int64

# can also do a more complicated selctor than the 0th row
In [92]: new_s[0] = 5

In [93]: new_s
Out[93]: 
bucket  start  stop
B1      1      1       5
               1       4
               2       4
               2       6
Name: x1, dtype: int64

In [94]: df2.ix[:,'x1'] = new_s

In [95]: df2
Out[95]: 
                                 date  x1  x2  x3
bucket start stop                                
B1     1     1    2000-10-03 00:00:00   5   2   3
             1    2000-01-04 00:00:00   4   3   3
             2    2000-01-03 00:00:00   4   2   3
             2    2000-01-04 00:00:00   6   2   2

0.11でできること

# this is sessentially saying give me the first 2 rows (equivalent
# to selecting via complicated tuple)
In [107]: df2.iloc[0:2,:]
Out[107]: 
                                 date  x1  x2  x3
bucket start stop                                
B1     1     1    2000-10-03 00:00:00  10   2   3
             1    2000-01-04 00:00:00   4   3   3

In [108]: df2.iloc[0:2,:].loc[:,'x1']
Out[108]: 
bucket  start  stop
B1      1      1       10
               1        4
Name: x1, dtype: int64

In [109]: df2.iloc[0:2,:].loc[:,'x1'] = 5

In [110]: df2
Out[110]: 
                                 date  x1  x2  x3
bucket start stop                                
B1     1     1    2000-10-03 00:00:00   5   2   3
             1    2000-01-04 00:00:00   5   3   3
             2    2000-01-03 00:00:00   4   2   3
             2    2000-01-04 00:00:00   6   2   2
于 2013-03-05T00:09:08.293 に答える
1

sub_dfが と同じインデックスを持つことが重要ですmaster_df

正しいインデックスを取得する 1 つの方法は、次を使用することget_locです。

sub_df = df[df.index.get_loc(('B1', 1, 2))]
# operations not changing index
master_df.update(sub_df)
于 2013-03-04T12:26:48.737 に答える
0

助けてくれてありがとう。最後に、レベル2と3の数値インデックスから文字インデックスに切り替えましたが、現在は正常に機能しています(これは、レベルでの適切な並べ替えにも役立ちました。これにより、状況がより明確になったと思います)。

于 2013-03-05T12:35:55.967 に答える
0

あなたが与える例(( 'B1'、1、2、...)を選択する)では、 xs iso ix を使用できます。ix とは対照的に、ラベルを使用する場合、xs はデータのビューを返すことができます (ビュー/コピーを返す ix の詳細については、docsを参照してください)。以下の例では、sub_df の列 X1 が変更され、master_df にも影響します。

In [48]: master_df
Out[48]: 
                              X1  X2  X3
bucket Start Stop Date                  
B1     1     1    2000-01-03   2   2   3
                  2000-01-04   4   3   3
             2    2000-01-03   4   2   3
                  2000-01-04   6   2   2

In [49]: sub_df = master_df.xs(['B1', 1, 2], copy=False)

In [50]: sub_df
Out[50]: 
            X1  X2  X3
Date                  
2000-01-03   4   2   3
2000-01-04   6   2   2

In [51]: sub_df.X1 -= 4

In [52]: sub_df
Out[52]: 
            X1  X2  X3
Date                  
2000-01-03   0   2   3
2000-01-04   2   2   2

In [53]: master_df
Out[53]: 
                              X1  X2  X3
bucket Start Stop Date                  
B1     1     1    2000-01-03   2   2   3
                  2000-01-04   4   3   3
             2    2000-01-03   0   2   3
                  2000-01-04   2   2   2
于 2013-03-06T20:34:28.497 に答える
0

0.13 では、パラメータ「drop_level」が「xs」に追加されたため、すべてのインデックス レベルが sub_df に存在するため、問題が解決されます。

sub_df = master_df.xs(['B1', 1, 2], level=['bucket','Start','Stop'], drop_level=False)

これでマージが機能します。

試したことはありませんが、うまくいくはずです。

ref: pandas を使用した「大規模データ」ワークフロー

于 2014-02-21T15:14:02.237 に答える