web-dev-qa-db-ja.com

pandas multiindex-列を使用するときに第2レベルを選択する方法?

このインデックスを持つデータフレームがあります:

_index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
_

_df['stock1']_を実行できる便利な構造ですが、すべての価格データを選択するにはどうすればよいですか?ドキュメントの意味がわかりません。

運よく以下を試しました:_df[:,'price']_ _df[:]['price']_ df.loc(axis=1)[:,'close'] _df['price]_

このインデックススタイルが何らかの理由で悪い考えであると一般的に同意されている場合、より良い選択は何でしょうか?列レベルではなく、時系列上のラベルとして株式のマルチインデックスインデックスを使用する必要がありますか?

どうもありがとう

編集-インデックスではなく、列にマルチインデックスを使用しています(言葉遣いのほうがいいと思います)。ドキュメントの例では、列構造ではなくマルチレベルインデックスに焦点を当てています。

22
AndyMoore

また、Johnのデータサンプルを使用します。

xs()を使用することは、MultiIndexをスライスする別の方法です。

df
               0
stock1 price   1
       volume  2
stock2 price   3
       volume  4
stock3 price   5
       volume  6

df.xs('price', level=1, drop_level=False)
              0
stock1 price  1
stock2 price  3
stock3 price  5

または、列の代わりにMultiIndexがある場合:

df
  stock1        stock2        stock3       
   price volume  price volume  price volume
0      1      2      3      4      5      6

df.xs('price', axis=1, level=1, drop_level=False)
  stock1 stock2 stock3
   price  price  price
0      1      3      5
30
Andrew L

@ JohnZwinckのデータサンプル を使用:

In [132]: df
Out[132]:
               0
stock1 price   1
       volume  2
stock2 price   3
       volume  4
stock3 price   5
       volume  6

オプション1:

In [133]: df.loc[(slice(None), slice('price')), :]
Out[133]:
              0
stock1 price  1
stock2 price  3
stock3 price  5

オプション2:

In [134]: df.loc[pd.IndexSlice[:, 'price'], :]
Out[134]:
              0
stock1 price  1
stock2 price  3
stock3 price  5
26
MaxU

df.unstack()は、MultiIndexの最後のレベルを「引き裂き」、データのタイプごとに1列のDataFrameをより従来のものにします。例えば:

index = pd.MultiIndex.from_product([['stock1','stock2','stock3'],['price','volume']])
df = pd.DataFrame([1,2,3,4,5,6], index)
print(df.unstack())

あなたにあげる:

           0       
       price volume
stock1     1      2
stock2     3      4
stock3     5      6
3
John Zwinck

また、このオプションを見逃していることに気付きました:

df.loc[:,"price"]

時間データのベストプラクティスとしては、行に対応する列に、できればPython(pandasには機能サポートが組み込まれています)のdatetimeオブジェクトとして保持します。関心に関連する時間のみを取得するマスク構文。

これが、データフレームの単一の列にアクセスする方法です。ただし、複数の列の場合、リストまたはコロンを渡してすべてを取得できます。

df.loc[:,["price","volume"]] 
#or
df.loc[:,:]

クエリを(そしてすばやく)行う便利な方法は、マスクを使用して、どの行/列がどの条件を満たすかを指定することです。

Mask=df.loc[:,"price"]>50.0
df.loc[Mask, "stock"] #should return the stock prices greater than 50bucks. 

これがお役に立てば幸いです。あなたの質問を完全に誤解した場合は、この回答をいつでも気軽にフォローしてください。さらにお手伝いしたいと思います。

0
bmc