Python Pandas - Báo trước và Gotchas

Caveats có nghĩa là cảnh báo và gotcha có nghĩa là một vấn đề không thể nhìn thấy.

Sử dụng câu lệnh If / Truth với gấu trúc

Gấu trúc tuân theo quy ước numpy về việc mắc lỗi khi bạn cố gắng chuyển đổi thứ gì đó thành bool. Điều này xảy ra trong mộtif hoặc là when sử dụng các phép toán Boolean và, or, hoặc là not. Không rõ kết quả sẽ như thế nào. Nó có nên là True bởi vì nó không phải là zerolength? Sai vì có giá trị Sai? Nó không rõ ràng, vì vậy thay vào đó, Pandas tăng mộtValueError -

import pandas as pd

if pd.Series([False, True, False]):
   print 'I am True'

Nó là output như sau -

ValueError: The truth value of a Series is ambiguous. 
Use a.empty, a.bool() a.item(),a.any() or a.all().

Trong ifđiều kiện, không rõ phải làm gì với nó. Lỗi này gợi ý về việc có nên sử dụngNone hoặc là any of those.

import pandas as pd

if pd.Series([False, True, False]).any():
   print("I am any")

Nó là output như sau -

I am any

Để đánh giá các đối tượng gấu trúc một phần tử trong ngữ cảnh Boolean, hãy sử dụng phương pháp .bool() -

import pandas as pd

print pd.Series([True]).bool()

Nó là output như sau -

True

Bitwise Boolean

Các toán tử Boolean của Bitwise như == và != sẽ trả về một chuỗi Boolean, hầu như luôn luôn là chuỗi bắt buộc.

import pandas as pd

s = pd.Series(range(5))
print s==4

Nó là output như sau -

0 False
1 False
2 False
3 False
4 True
dtype: bool

hoạt động isin

Điều này trả về một chuỗi Boolean cho biết liệu mỗi phần tử trong Chuỗi có được chứa chính xác trong chuỗi giá trị được truyền hay không.

import pandas as pd

s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s

Nó là output như sau -

0 True
1 False
2 True
dtype: bool

Reindexing vs ix Gotcha

Nhiều người dùng sẽ thấy mình sử dụng ix indexing capabilities như một phương tiện ngắn gọn để chọn dữ liệu từ một đối tượng 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 df.ix[['b', 'c', 'e']]

Nó là output như sau -

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

Tất nhiên, trong trường hợp này, điều này hoàn toàn tương đương với việc sử dụng reindex phương pháp -

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'])

Nó là output như sau -

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

Một số có thể kết luận rằng ixreindex100% tương đương dựa trên điều này. Điều này đúng ngoại trừ trường hợp lập chỉ mục số nguyên. Ví dụ, hoạt động trên có thể được biểu diễn theo cách khác là:

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])

Nó là output như sau -

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

Điều quan trọng cần nhớ là reindex is strict label indexing only. Điều này có thể dẫn đến một số kết quả có khả năng gây ngạc nhiên trong các trường hợp bệnh lý khi một chỉ mục chứa cả số nguyên và chuỗi.