Các câu lệnh or
và and
python yêu cầu giá truth
trị. Đối với pandas
những điều này được coi là mơ hồ, do đó bạn nên sử dụng các hoạt động "bitwise" |
(hoặc) hoặc &
(và):
result = result[(result['var']>0.25) | (result['var']<-0.25)]
Chúng bị quá tải cho các loại dữ liệu này để mang lại yếu tố khôn ngoan or
(hoặc and
).
Chỉ cần thêm một số giải thích cho tuyên bố này:
Trường hợp ngoại lệ được ném khi bạn muốn để có được bool
một pandas.Series
:
>>> import pandas as pd
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Những gì bạn đạt được một nơi mà các nhà điều hành ngầm chuyển đổi các toán hạng để bool
(bạn sử dụng or
nhưng nó cũng xảy ra cho and
, if
và while
):
>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
... print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Bên cạnh những 4 báo cáo có một số chức năng python mà ẩn một số bool
cuộc gọi (như any
, all
, filter
, ...) đây là những thường không có vấn đề với pandas.Series
nhưng cho đầy đủ tôi muốn đề cập đến những.
Trong trường hợp của bạn, ngoại lệ không thực sự hữu ích, vì nó không đề cập đến các lựa chọn thay thế phù hợp . Cho and
và or
bạn có thể sử dụng (nếu bạn muốn so sánh phần tử khôn ngoan):
numpy.logical_or
:
>>> import numpy as np
>>> np.logical_or(x, y)
hoặc đơn giản là |
toán tử:
>>> x | y
numpy.logical_and
:
>>> np.logical_and(x, y)
hoặc đơn giản là &
toán tử:
>>> x & y
Nếu bạn đang sử dụng các toán tử thì hãy chắc chắn rằng bạn đặt dấu ngoặc đơn chính xác vì ưu tiên toán tử .
Có một số chức năng NumPy logic mà nên làm việc trên pandas.Series
.
Các lựa chọn thay thế được đề cập trong Ngoại lệ sẽ phù hợp hơn nếu bạn gặp phải nó khi thực hiện if
hoặc while
. Tôi sẽ giải thích ngắn gọn về từng điều sau:
Nếu bạn muốn kiểm tra xem Series của bạn có trống không :
>>> x = pd.Series([])
>>> x.empty
True
>>> x = pd.Series([1])
>>> x.empty
False
Python thường diễn giải len
thứ g container (như list
, tuple
, ...) như là chân lý có giá trị nếu nó không có sự giải thích rõ ràng boolean. Vì vậy, nếu bạn muốn kiểm tra giống như con trăn, bạn có thể làm: if x.size
hoặc if not x.empty
thay vì if x
.
Nếu bạn Series
chứa một và chỉ một giá trị boolean:
>>> x = pd.Series([100])
>>> (x > 50).bool()
True
>>> (x < 50).bool()
False
Nếu bạn muốn kiểm tra mục đầu tiên và duy nhất của Sê-ri của mình (thích .bool()
nhưng hoạt động ngay cả đối với nội dung không phải là boolean):
>>> x = pd.Series([100])
>>> x.item()
100
Nếu bạn muốn kiểm tra xem tất cả hoặc bất kỳ mục nào không phải là không, không trống hoặc không-Sai:
>>> x = pd.Series([0, 1, 2])
>>> x.all() # because one element is zero
False
>>> x.any() # because one (or more) elements are non-zero
True
|
thay vìor