警告和疑難意味著一個看不見的問題。在使用Pandas過程中,需要特別注意的地方。
當嘗試將某些東西轉換成布林值時,Pandas遵循了一個錯誤的慣例。 這種情況發生在使用布林運算的。 目前還不清楚結果是什麼。 如果它是真的,因為它不是zerolength
? 錯誤,因為有錯誤的值? 目前還不清楚,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().
在if
條件,它不清楚如何處理它。錯誤提示是否使用None或任何這些。
import pandas as pd
if pd.Series([False, True, False]).any():
print("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
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陷阱
許多使用者會發現自己使用ix
索引功能作為從Pandas物件中選擇資料的簡潔方法 -
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 ("=============================================")
print (df.ix[['b', 'c', 'e']])
執行上面範例程式碼,得到以下結果 -
one two three four
a -1.174632 0.951047 -0.177007 1.036567
b -0.806324 -0.562209 1.081449 -1.047623
c 0.107607 0.778843 -0.063531 -1.073552
d -0.277602 -0.962720 1.381249 0.868656
e 0.576266 0.986949 0.433569 0.539558
f -0.708917 -0.583124 -0.686753 -2.338110
=============================================
one two three four
b -0.806324 -0.562209 1.081449 -1.047623
c 0.107607 0.778843 -0.063531 -1.073552
e 0.576266 0.986949 0.433569 0.539558
這當然在這種情況下完全等同於使用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("=============================================")
print (df.reindex(['b', 'c', 'e']))
執行上面範例程式碼,得到以下結果 -
one two three four
a -1.754084 -1.423820 -0.152234 -1.475104
b 1.508714 -0.216916 -0.184434 -2.117229
c -0.409298 -0.224142 0.308175 -0.681308
d 0.938517 -1.626353 -0.180770 -0.470252
e 0.718043 -0.730215 -0.716810 0.546039
f 2.313001 0.371286 0.359952 2.126530
=============================================
one two three four
b 1.508714 -0.216916 -0.184434 -2.117229
c -0.409298 -0.224142 0.308175 -0.681308
e 0.718043 -0.730215 -0.716810 0.546039
有人可能會得出這樣的結論,ix
和reindex
是基於這個100%
的等價物。 除了整數索引的情況,它是true
。例如,上述操作可選地表示為 -
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("=====================================")
print (df.ix[[1, 2, 4]])
print("=====================================")
print (df.reindex([1, 2, 4]))
執行上面範例程式碼,得到以下結果 -
one two three four
a 1.017408 0.594357 -0.760587 1.001547
b -1.480067 1.524270 0.455070 1.886959
c -0.136238 -0.165867 -0.589767 -1.078473
d 0.670576 1.600312 0.219578 -1.121352
e -0.224181 0.958156 0.013055 -0.013652
f 1.576155 -0.185003 -0.527204 -0.336275
=====================================
one two three four
b -1.480067 1.524270 0.455070 1.886959
c -0.136238 -0.165867 -0.589767 -1.078473
e -0.224181 0.958156 0.013055 -0.013652
=====================================
one two three four
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
4 NaN NaN NaN NaN
重要的是要記住,reindex
只是嚴格的標籤索引。這可能會導致一些潛在的令人驚訝的結果,例如索引包含整數和字串的病態情況。