Python-pandas-caveats-and-gotchas
提供:Dev Guides
Python Pandas-警告と落とし穴
警告は警告を意味し、落とし穴は目に見えない問題を意味します。
パンダでIf/Truthステートメントを使用する
Pandasは、何かを bool に変換しようとするとエラーを発生させるというnumpyの規則に従います。 これは、ブール演算を使用する if または when 、および or または not で発生します。 結果がどうあるべきかは明確ではありません。 長さがゼロではないため、Trueである必要がありますか? False値があるためFalse。 それは明確ではないので、代わりに、パンダは 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().
*if* 状態では、それをどうするかは不明です。 エラーは、 *None* または* anyのいずれかを使用するかどうかを示唆しています。
import pandas as pd
if pd.Series([False, True, False]).any():
print("I am any")
その*出力*は次のとおりです-
I am any
ブールコンテキストで単一要素のパンダオブジェクトを評価するには、メソッド* .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
isin操作
これは、シリーズの各要素が渡された値のシーケンスに正確に含まれているかどうかを示すブールシリーズを返します。
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
再索引付けとix Gotcha
多くのユーザーは、パンダオブジェクトからデータを選択する簡潔な手段として* 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[[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
- reindexは厳密なラベルインデックスのみであることに注意することが重要です。 これにより、インデックスに整数と文字列の両方が含まれるような病理学的なケースで、驚くべき結果が生じる可能性があります。