English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandasの注意点と罠
ifやwhen、orやor notなどの布尔演算子を使用して、ある内容をboolに変換しようとすると、時にはエラーが発生します。エラーがどのように発生するかはまだ明確ではありません。PandasはValueError例外を提案しています。
import pandas as pd if pd.Series([False, True, False]): print 'I am True'
以下は実行結果です:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool() a.item(),a.any() or a.all().
この場合、どのように処理するかは明確ではありません。このエラーは、Noneを使用しているか、またはそのいずれかを使用していることを示しています。
import pandas as pd if pd.Series([False, True, False]).any(): print("I am any")
以下は実行結果です:
I am any
単一要素のPandasオブジェクトを布尔上下文で評価するには、.bool()メソッドを使用してください。-
import pandas as pd print pd.Series([True]).bool()
以下は実行結果です:
True
==や!などのビット演算子のような按位布尔演算子は、布尔系列を返し、これはほぼ常に必要です。
import pandas as pd s = pd.Series(range(5)) print s==4
以下は実行結果です:
0 False 1 False 2 False 3 False 4 True dtype: bool
これは、布尔値の各要素が渡された値のシーケンスに完全に含まれているかどうかを示す布尔系列を返します。
import pandas as pd s = pd.Series(list('abc')) s = s.isin(['a', 'c', 'e']) print s
以下は実行結果です:
0 True 1 False 2 True dtype: bool
多くのユーザーは、Pandasオブジェクトからデータを選択するための簡潔な方法としてixインデックス機能を使用することがあります:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', ,'four'],index=list('abcdef')) print df print df.ix[['b', 'c', 'e']]
以下は実行結果です:
one two three four a -1.582025 1.335773 0.961417 -1.272084 b 1.461512 0.111372 -0.072225 0.553058 c -1.240671 0.762185 1.511936 -0.630920 d -2.380648 -0.029981 0.196489 0.531714 e 1.846746 0.148149 0.275398 -0.244559 f -1.842662 -0.933195 2.303949 0.677641 one two three four b 1.461512 0.111372 -0.072225 0.553058 c -1.240671 0.762185 1.511936 -0.630920 e 1.846746 0.148149 0.275398 -0.244559
もちろん、この場合、これはreindexメソッドを使用するのと全く同じです:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', ,'four'],index=list('abcdef')) print df print df.reindex(['b', 'c', 'e'])
以下は実行結果です:
one two three four a 1.639081 1.369838 0.261287 -1.662003 b -0.173359 0.242447 -0.494384 0.346882 c -0.106411 0.623568 0.282401 -0.916361 d -1.078791 -0.612607 -0.897289 -1.146893 e 0.465215 1.552873 -1.841959 0.329404 f 0.966022 -0.190077 1.324247 0.678064 one two three four b -0.173359 0.242447 -0.494384 0.346882 c -0.106411 0.623568 0.282401 -0.916361 e 0.465215 1.552873 -1.841959 0.329404
誰かは、ixとreindexがこのようにして100%相当の。整数インデックス以外のすべての場合、これが適用されます。例えば、上記の操作は以下のように代替的に表現できます:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', ,'four'],index=list('abcdef')) print df print df.ix[[1, 2, 4]) print df.reindex([1, 2, 4])
以下は実行結果です:
one two three four a -1.015695 -0.553847 1.106235 -0.784460 b -0.527398 -0.518198 -0.710546 -0.512036 c -0.842803 -1.050374 0.787146 0.205147 d -1.238016 -0.749554 -0.547470 -0.029045 e -0.056788 1.063999 -0.767220 0.212476 f 1.139714 0.036159 0.201912 0.710119 one two three four b -0.527398 -0.518198 -0.710546 -0.512036 c -0.842803 -1.050374 0.787146 0.205147 e -0.056788 1.063999 -0.767220 0.212476 one two three four 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 4 NaN NaN NaN NaN
重要なのは、再インデックスは厳格なタグインデックスに過ぎないことを覚えておくことです。インデックスに整数や文字列などのエラーが含まれている場合、予期せぬ結果が発生する可能性があります。