Kiểm tra hiệu quả xem đối tượng tùy ý có phải là NaN trong Python / numpy / pandas không?


101

Mảng numpy của tôi sử dụng np.nanđể chỉ định các giá trị bị thiếu. Khi tôi lặp lại tập dữ liệu, tôi cần phát hiện các giá trị bị thiếu đó và xử lý chúng theo những cách đặc biệt.

Tôi đã sử dụng một cách ngây thơ numpy.isnan(val), hoạt động tốt trừ khi valkhông nằm trong tập hợp con các loại được hỗ trợ numpy.isnan(). Ví dụ: dữ liệu bị thiếu có thể xảy ra trong các trường chuỗi, trong trường hợp đó tôi nhận được:

>>> np.isnan('some_string')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type

Ngoài việc viết một trình bao bọc đắt tiền để bắt ngoại lệ và trả lại False, có cách nào để xử lý điều này một cách thanh lịch và hiệu quả không?


8
pandaspandas.isnull(): Tôi không chắc liệu điều đó có đáp ứng nhu cầu của bạn hay không, vì vậy một số dữ liệu mẫu có thể tốt.
Marius

4
@Marius: pandas.isnull()có vẻ hoạt động hoàn hảo. Loại dữ liệu duy nhất mà tôi hiện đang xử lý có ngắt numpy.isnan()là chuỗi và pandas.isnull()xử lý tốt. Trong thực tế, nó dường như xử lý tốt tất cả bất kỳ đối tượng tùy ý nào tôi ném vào nó. Có bất kỳ vấn đề cụ thể nào bạn quan tâm không? Nếu không, bạn có thể muốn gửi nhận xét của mình dưới dạng câu trả lời chính thức, vì nó có vẻ giống như câu trả lời chuẩn, ít nhất là đối với người dùng gấu trúc.
Dun Peal

Câu trả lời:


169

pandas.isnull()(ngoài ra pd.isna(), trong các phiên bản mới hơn) kiểm tra các giá trị bị thiếu trong cả mảng số và chuỗi / đối tượng. Từ tài liệu, nó kiểm tra:

NaN trong mảng số, Không có / NaN trong mảng đối tượng

Ví dụ nhanh:

import pandas as pd
import numpy as np
s = pd.Series(['apple', np.nan, 'banana'])
pd.isnull(s)
Out[9]: 
0    False
1     True
2    False
dtype: bool

Ý tưởng sử dụng numpy.nanđể đại diện cho các giá trị bị thiếu là một cái gì đó đã được pandasgiới thiệu, đó là lý do tại sao pandascó các công cụ để giải quyết nó.

Datetimes cũng vậy (nếu bạn sử dụng, pd.NaTbạn sẽ không cần chỉ định loại dtype)

In [24]: s = Series([Timestamp('20130101'),np.nan,Timestamp('20130102 9:30')],dtype='M8[ns]')

In [25]: s
Out[25]: 
0   2013-01-01 00:00:00
1                   NaT
2   2013-01-02 09:30:00
dtype: datetime64[ns]``

In [26]: pd.isnull(s)
Out[26]: 
0    False
1     True
2    False
dtype: bool

19

Kiểu của bạn có thực sự độc đoán không? Nếu bạn biết nó sẽ chỉ là một int float hoặc string, bạn có thể làm

 if val.dtype == float and np.isnan(val):

giả sử nó được bọc trong numpy, nó sẽ luôn có kiểu dtype và chỉ float và complex mới có thể là NaN


Tôi đang xử lý nhiều loại dữ liệu khác nhau. Trong khi hầu hết các cột có kiểu dữ liệu int * hoặc float *, những cột khác có thể là bất kỳ đối tượng nào, mặc dù cho đến nay, kiểu khác duy nhất mà tôi sử dụng là chuỗi.
Dun Peal

Chuỗi trong python không có dtype. Bạn có thể phải làmtype(val) == 'float'
pvarma

4
type(val) == float and np.isnan(val)- làm việc cho tôi
Danny Cullen

@ user1930402 Tôi giả sử đây là các mảng numpy không phải là các mảng python thông thường. Ví dụ: np.array ([ "hello"]) [0] .dtype công trình nhưng [ "hello"] [0] .dtype không
Hammer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.