2016-07-09 4 views
3

私はPythonとこのコミュニティにはかなり新しいので、おそらく非常に明白なものに私の深遠な混乱を説明する私の素人な試みを許してください。とにかく...xsでスライスしているときにmultiIndex DataFrameでany()とall()を使用すると、

私は「データ」と呼ばれるデータフレームを持っています。これは、 "日付"と "おなら"からなる2つのレベルのmultiIndexedです。

"integrated_daily_difference"という単一の列があります。あなたが「オナラ」を想定することができ

は型である:「pandas.core.index.Index」とを経て作成されました: farts = data.index.levels[1]

は今、私は、任意で私のデータフレームのスライスビューを取るたいと思います想像することができますオナラのインデックス値:つまりオナラ[1]

ミー:

data.xs(farts[1], level = 1) 

コンピュータ:

    integrated_daily_difference 
     date  
2015-05-21 00:00:00+00:00 0.000000 
2015-05-22 00:00:00+00:00 0.000000 
2015-05-26 00:00:00+00:00 -0.024497 
2015-05-27 00:00:00+00:00 -0.051144 
2015-05-28 00:00:00+00:00 -0.079841 
2015-05-29 00:00:00+00:00 -0.106666 
2015-06-01 00:00:00+00:00 -0.131245 
2015-06-02 00:00:00+00:00 -0.157428 
2015-06-03 00:00:00+00:00 -0.184057 
2015-06-04 00:00:00+00:00 -0.209755 
2015-06-05 00:00:00+00:00 -0.234588 
2015-06-08 00:00:00+00:00 -0.262365 
2015-06-09 00:00:00+00:00 -0.291890 
2015-06-10 00:00:00+00:00 -0.320943 
2015-06-11 00:00:00+00:00 -0.352627 
2015-06-12 00:00:00+00:00 -0.381425 
2015-06-15 00:00:00+00:00 -0.404055 

ミー:

data.xs(farts[1], level = 1) < 0 

コンピュータ:

   integrated_daily_difference 
     date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 True 
2015-05-27 00:00:00+00:00 True 
2015-05-28 00:00:00+00:00 True 
2015-05-29 00:00:00+00:00 True 
2015-06-01 00:00:00+00:00 True 
2015-06-02 00:00:00+00:00 True 
2015-06-03 00:00:00+00:00 True 
2015-06-04 00:00:00+00:00 True 
2015-06-05 00:00:00+00:00 True 
2015-06-08 00:00:00+00:00 True 
2015-06-09 00:00:00+00:00 True 
2015-06-10 00:00:00+00:00 True 
2015-06-11 00:00:00+00:00 True 
2015-06-12 00:00:00+00:00 True 
2015-06-15 00:00:00+00:00 True 

私は、これは結果が真であるので、値が私のスライスされたデータフレーム内の任意の場所のために存在するかどうかを返すと仮定?

ミー:

data.xs(farts[1], level = 1).any() 

コンピュータ:

integrated_daily_difference True 
dtype: bool 

OKが、これはすべての種類の意味があります。今、奇妙なもののために...

ミー:

data.xs(farts[1], level = 1).any() < 0 

コンピュータ:

integrated_daily_difference False 
dtype: bool 

はぁ......?

ミー:

data.xs(farts[1], level = 1).any(axis = 0) < 0 

コンピュータ:

integrated_daily_difference False 
dtype: bool 

ミー:

data.xs(farts[1], level = 1).any(axis = 1) < 0 

コンピュータ:

 date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

ミー:

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

がコンピュータ:

 date 
2015-05-21 00:00:00+00:00  True 
2015-05-22 00:00:00+00:00  True 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

ミー:

data.xs(farts[1], level = 1).any(axis = 0) <= 0 

がコンピュータ:

integrated_daily_difference False 
dtype: bool 

はその後、私のコンピュータは、強迫笑っ開始しました私と私の頭が爆発した...

もっと真剣に、ここで何が起こっているのですか?私の目標は、単一の列のデータフレーム内のすべての値またはすべての値が条件を満たすかどうかをチェックし、TrueまたはFalseのブール値を返すことだけです。私は正しく()を使用しているようではないので、私は助けを求めています。

ご了承ください。前もって感謝します!

答えて

2

まず私は

pandas-

のマニュアルに従って、どのような任意の手段の任意の要素は今、あなたが書いたときに要求された軸

の上に真であるかどうかReturnキーを定義してみましょう -

data.xs(farts[1], level = 1).any() 

それは、値が真実かどうかをチェックするだけです。しかし、条件がないので、です。 venは数字だけをチェックします。つまり、0はFalse、それ以外の数字はTrueとなります。今度はとして0以外の数字があり、それはTrueを返します。

data.xs(farts[1], level = 1).any() < 0 

をしかし、真は1であるとFalseはdata.xs(farts[1], level = 1).any()への出力が真である1。ですから、

をチェックしましょう場合である、それはFalseを返すので、整数として表されたときに0である - 今

あなたがチェック

data.xs(farts[1], level = 1).any() == 1 

Trueを返します。

は今、あなたが行うときに何が起こるか見ることができます -

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

まずあなたが軸を変更した、今data.xs(farts[1], level = 1).any(axis = 1)リターンだけTruesとFalses 0とFalse以外の値のために/ 1真の値(によります/ 0の値の場合は0)。今度は、最初の2つの値が0 /偽のであり、条件 "< = 0"を満たしているため、表示される出力が得られます。試してみてください -

data.xs(farts[1], level = 1).any(axis = 1) == 1 

あなたは正反対の出力を得るでしょう。

any()とは異なり、all()の動作は異なります。すべてがTrueまたはFalseの場合はtrueを返し、それ以外の場合はFalseを返します。

そして、ちょうどに言及 - あなたは思うかもしれない場合

anyor OR allandは同じではありません.... かとし、ビット演算であり、彼らはshort circuit evaluationが、任意に従うと、すべて機能しているので、すべての条件を満たすことができます。

はそれが役に立てば幸い:)

+0

これは非常に役に立ちます。ありがとうございました!私は実際に少し深く行って、次のように試しました:mylist = [1,2,3,4,0、-1] 'test 1:'、すべて(mylist)> -1 'test 2:すべて(i> -1、私はmylistで)テスト1は真、テスト2は偽を表示しました。私はこれがTrue(1)とFalse(0)の両方であると仮定します。最初の場合は-1より大きく、ジェネレータで評価された場合はそれは異なって動作します.. –

+0

最初のtry、 'all(mylist) '再び条件はありませんが、リストには0が含まれているので、数値的に0のFalseを返します。なぜなら、"> -1 "でテストするとTrueを返します。 – hashcode55

+0

と2番目のものでは、ブーリアンのリストをテストしています! i> -1は-1に対してFalseを返します。これは全体的なFalseにつながります。try> = -1とすると、Trueを取得します。あなたが念頭に置いておかなければならない基本コンセプトです。 "反復可能な要素のどれかが真であればTrueを返します。"いずれかと「反復可能のすべての要素に該当する場合、Trueを返します」のために - - すべての – hashcode55

3

このシンプルシリーズ考えてみましょう:今すぐ

ser < 2 
Out[79]: 
0  True 
1  True 
2  True 
3  True 
4  True 
5 False 
6  True 
7 False 
8  True 
9  True 
dtype: bool 

import numpy as np 
np.random.seed(0) 
ser = pd.Series(np.random.randint(0, 3, 10)) 

ser 
Out[78]: 
0 0 
1 1 
2 0 
3 1 
4 1 
5 2 
6 0 
7 2 
8 0 
9 0 
dtype: int32 

のは、あなたが比較ser < 2をしたいとしましょうと、それはboolean型の配列を返します。それらのいずれかが2より小さいかどうかを確認する場合は、anyに電話する必要があります。

(ser < 2).any() 
Out[81]: True 
ser < 2

配列内の値の少なくとも一つがTrueである場合、これはTrueを返します。 .all()は似ています

(ser < 2).all() 
Out[82]: False 

ないそれらのすべてが真であるため、それはFalseを返します。あなたはそれを変更する場合:

(ser < 3).all() 
Out[83]: True 

それは(ser < 3)配列をチェックし、その配列内のすべての要素がTrueあるため。

今度はser.any()を試してみましょう:

ser.any() 
Out[84]: True 

をここでは、(0がTrueの場合1などTrueの場合、)配列の値のいずれかがTrueある場合は、チェックしています。この配列の値は整数でありブール値ではありません。それらが0に等しくない場合、それらはTrueと評価されます。その配列に少なくとも1つの非ゼロがあるので、Trueを返します。私はser.any() < 0をチェックすると

さて、それはFalseを返します。

ser.any() < 0 
Out[85]: False 

この式はTrue < 0に評価されているので:0より小さくないFalseTrueので、それはある

True < 0 
Out[86]: False 

何同じことをしています:

data.xs(farts[1], level = 1).any() < 0 

最初にそのセクションでany()を実行し、そのセクションにゼロ以外の要素があるのでTrueを返します。あなたが実際にそれらのいずれかが0より小さいか否かを確認したい場合は、次のように入力する必要があります

(data.xs(farts[1], level = 1) < 0).any() 

(data.xs(farts[1], level = 1) < 0)ブール配列を作成し、その配列の要素のいずれかがTrueであれば、.any()も同様True戻ります。

+0

お返事ありがとうございます。非常に役立ちます :) –

関連する問題