Hướng dẫn why am i getting nan in python? - tại sao tôi lại nhận được nan trong python?

Nếu bạn thực hiện bất kỳ điều nào sau đây mà không cần cưỡi ngựa với môi trường dấu phẩy

  • from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    3 (ký tên ở trên và dưới)
  • from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    4 (dấu hiệu ở trên và dưới)
  • from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    5 hoặc
    from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    6 hoặc
    from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    7 hoặc
    from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    8
  • from math import isnan
    from datatest import validate
    
    
    data = [5, 6, float('nan')]
    
    def not_nan(x):
        """Values should not be NaN."""
        return not isnan(x)
    
    validate(data, not_nan)
    
    9 và
    from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    0 (hoặc ký vào cả hai yếu tố)
  • from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    1 khi
    from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    2
  • from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    3 khi
    from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    4 hoặc
    from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    5 là vô hạn; Ở đây
    from math import isnan
    from datatest import validate, Predicate
    
    
    data = [5, 6, float('nan')]
    
    requirement = ~Predicate(isnan)
    
    validate(data, requirement)
    
    6 là phần còn lại của điểm nổi.

Tài liệu tham khảo kinh điển cho các khía cạnh của số học máy là đặc điểm kỹ thuật của IEEE 754. Mục 7.1 mô tả ngoại lệ hoạt động không hợp lệ, đây là trường hợp được nâng lên khi bạn sắp nhận được NAN. "Ngoại lệ" trong IEEE 754 có nghĩa là một cái gì đó khác với bối cảnh ngôn ngữ lập trình.

Rất nhiều triển khai chức năng đặc biệt ghi lại hành vi của họ tại các điểm kỳ dị của chức năng mà họ đang cố gắng thực hiện. Xem trang người đàn ông cho

from math import isnan
from datatest import validate, Predicate


data = [5, 6, float('nan')]

requirement = ~Predicate(isnan)

validate(data, requirement)
7 và
from math import isnan
from datatest import validate, Predicate


data = [5, 6, float('nan')]

requirement = ~Predicate(isnan)

validate(data, requirement)
8 chẳng hạn.

Bạn đang hỏi cụ thể về Numpy và Scipy. Tôi không chắc liệu điều này có chỉ đơn giản là nói "Tôi đang hỏi về số học của máy xảy ra dưới mui xe trong Numpy" hoặc "Tôi đang hỏi về

from math import isnan
from datatest import validate, Predicate


data = [5, 6, float('nan')]

requirement = ~Predicate(isnan)

validate(data, requirement)
9 và các thứ." Tôi cho rằng trước đây, nhưng phần còn lại của câu trả lời này cố gắng tạo ra một kết nối mơ hồ với các chức năng cấp cao hơn trong Numpy. Quy tắc cơ bản là: Nếu việc thực hiện một hàm thực hiện một trong những tội lỗi ở trên, bạn sẽ nhận được một nan.If the implementation of a function commits one of the above sins, you get a NaN.

Ví dụ, đối với

from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
0, bạn có thể nhận được
from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
1 nếu giá trị đầu vào của bạn khoảng
from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
2 hoặc lớn hơn và mất độ chính xác im lặng nếu giá trị đầu vào của bạn khoảng
from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
3 hoặc nhỏ hơn. Tuy nhiên, ngoài các đầu vào thực sự lố bịch, bạn khá an toàn với
from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
0.

Đối với những thứ liên quan đến toán học ma trận, Nans có thể tăng lên (thường là thông qua tuyến đường

from math import isnan
from datatest import validate


data = [5, 6, float('nan')]

def not_nan(x):
    """Values should not be NaN."""
    return not isnan(x)

validate(data, not_nan)
5) nếu số của bạn là rất lớn hoặc ma trận của bạn cực kỳ không điều hòa. Một cuộc thảo luận đầy đủ về cách bạn có thể bị lừa bởi đại số tuyến tính số là quá dài để thuộc về một câu trả lời. Tôi khuyên bạn nên xem qua một cuốn sách đại số tuyến tính số (Trefethen và Bau rất phổ biến) trong suốt vài tháng thay thế.or your matrix is extremely ill-conditioned. A complete discussion of how you can get screwed by numerical linear algebra is too long to belong in an answer. I'd suggest going over a numerical linear algebra book (Trefethen and Bau is popular) over the course of a few months instead.

Một điều tôi đã thấy hữu ích khi viết và gỡ lỗi mã mà "không nên" tạo ra NAN là bảo máy bẫy nếu xảy ra NAN. Trong Gnu C, tôi làm điều này:

#include 
feenableexcept(FE_INVALID);

DataTest

Khi kiểm tra một số loại dữ liệu nhất định, bạn có thể gặp các giá trị NAN. Làm việc với Nans có thể bực bội vì họ không phải lúc nào cũng hành động như người ta mong đợi.

Về giá trị NAN:

  • Nan là viết tắt của không phải là một số.

  • Các giá trị NAN đại diện cho kết quả không xác định hoặc không thể hiện được từ các hoạt động toán học nhất định.

  • Các hoạt động toán học liên quan đến NAN sẽ trả lại NAN hoặc tăng ngoại lệ.

  • So sánh liên quan đến NAN sẽ trả về sai.

Kiểm tra các giá trị NAN

Để đảm bảo các thành phần dữ liệu không chứa các giá trị NAN, bạn có thể sử dụng hàm trợ giúp:

from math import isnan
from datatest import validate


data = [5, 6, float('nan')]

def not_nan(x):
    """Values should not be NaN."""
    return not isnan(x)

validate(data, not_nan)

Bạn cũng có thể làm điều này bằng cách sử dụng một trận đấu

from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
6 đảo ngược:

from math import isnan
from datatest import validate, Predicate


data = [5, 6, float('nan')]

requirement = ~Predicate(isnan)

validate(data, requirement)

Chấp nhận sự khác biệt của NaN

Nếu xác thực không thành công và trả về sự khác biệt của NAN, bạn có thể chấp nhận chúng như bất kỳ sự khác biệt nào khác:

from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)

Giống như các giá trị khác, Nans cũng có thể được chấp nhận như một phần của danh sách, bộ hoặc ánh xạ các khác biệt:

from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)

Ghi chú

Giá trị

from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
7 là mới trong Python 3.5. Các giá trị NAN cũng có thể được tạo trong bất kỳ phiên bản Python nào bằng cách sử dụng
from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
8.

Bỏ Nans trước khi xác thực

Đôi khi, nó OK OK để bỏ qua các giá trị NAN hoàn toàn. Nếu điều này là phù hợp trong hoàn cảnh của bạn, bạn chỉ cần xóa tất cả các bản ghi NAN và xác thực dữ liệu còn lại.

Nếu bạn sử dụng gấu trúc, bạn có thể gọi các phương thức

from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
9 và
from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
0 để bỏ các bản ghi có chứa các giá trị NAN:

import pandas as pd
from datatest import validate


source = pd.Series([1, 1, 2, 2, float('nan')])

data = source.dropna()  # Drop NaN valued elements.
requirement = {1, 2}

validate(data, requirement)

Yêu cầu giá trị nan

Nếu cần thiết, nó có thể yêu cầu Nans xuất hiện trong dữ liệu của bạn. Nhưng việc đặt các giá trị NAN trực tiếp vào một yêu cầu có thể được thực hiện với các vấn đề và thường nên tránh. Cách mạnh mẽ nhất để làm điều này là bằng cách thay thế các giá trị NAN bằng mã thông báo đặc biệt và sau đó yêu cầu mã thông báo.

Dưới đây, chúng tôi xác định một đối tượng

from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
1 tùy chỉnh và sử dụng nó để thay thế các giá trị NAN thực tế.

Nếu bạn sử dụng gấu trúc, bạn có thể gọi các phương thức

from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
2 và
from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
3 để thay thế Nans bằng một giá trị khác:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

import pandas as pd
from datatest import validate


class NanToken(object):
    def __repr__(self):
        return self.__class__.__name__

NanToken = NanToken()


source = pd.Series([1, 1, 2, 2, float('nan')])

data = source.fillna(NanToken)  # Replace NaNs with NanToken.
requirement = {1, 2, NanToken}

validate(data, requirement)

Hiểu sâu hơn

Bình đẳng: Nan ≠ Nan¶

Các giá trị NAN don lồng so sánh bằng bất cứ thứ gì, ngay cả bản thân họ:

>>> x = float('nan')
>>> x == x
False

Để kiểm tra xem một giá trị là NAN, nó có phổ biến cho các mô -đun và gói để cung cấp chức năng cho mục đích này không (ví dụ:

from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
4,
from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
5,
from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
6, v.v.):

>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True

Mặc dù các giá trị NAN không thể được so sánh trực tiếp, chúng có thể được so sánh như là một phần của đối tượng khác biệt. Trên thực tế, các so sánh khác biệt coi tất cả các giá trị NAN là bằng nhau ngay cả khi loại cơ bản là khác nhau:

from math import isnan
from datatest import validate


data = [5, 6, float('nan')]

def not_nan(x):
    """Values should not be NaN."""
    return not isnan(x)

validate(data, not_nan)
0

Danh tính: Nan là Nan, ngoại trừ khi nó không phải là

Một số gói cung cấp một hằng số NAN có thể được tham chiếu trong mã người dùng (ví dụ:

from math import nan
from datatest import validate, accepted, Extra


data = [5, 6, float('nan')]
requirement = {5, 6}

with accepted(Extra(nan)):
    validate(data, requirement)
7 và
from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
8). Mặc dù có thể hấp dẫn khi sử dụng các hằng số này để kiểm tra các giá trị NAN phù hợp, nhưng phương pháp này không đáng tin cậy trong thực tế.

Để tối ưu hóa hiệu suất, Numpy và Pandas phải quản lý nghiêm ngặt các bố cục bộ nhớ của dữ liệu mà chúng chứa. Khi

from math import nan
from datatest import validate, accepted, Missing, Extra


data = [5, 6, float('nan')]
requirement = {5, 6, 7}

with accepted([Missing(7), Extra(nan)]):
    validate(data, requirement)
8 được chèn vào
import pandas as pd
from datatest import validate


source = pd.Series([1, 1, 2, 2, float('nan')])

data = source.dropna()  # Drop NaN valued elements.
requirement = {1, 2}

validate(data, requirement)
0 hoặc
import pandas as pd
from datatest import validate


source = pd.Series([1, 1, 2, 2, float('nan')])

data = source.dropna()  # Drop NaN valued elements.
requirement = {1, 2}

validate(data, requirement)
1, giá trị được ép vào một
import pandas as pd
from datatest import validate


source = pd.Series([1, 1, 2, 2, float('nan')])

data = source.dropna()  # Drop NaN valued elements.
requirement = {1, 2}

validate(data, requirement)
2 tương thích khi cần thiết. Khi một loại NAN NAN bị ép buộc, một thể hiện riêng biệt được tạo và khả năng khớp bằng cách sử dụng toán tử
import pandas as pd
from datatest import validate


source = pd.Series([1, 1, 2, 2, float('nan')])

data = source.dropna()  # Drop NaN valued elements.
requirement = {1, 2}

validate(data, requirement)
3 không còn hoạt động như bạn mong đợi:

from math import isnan
from datatest import validate


data = [5, 6, float('nan')]

def not_nan(x):
    """Values should not be NaN."""
    return not isnan(x)

validate(data, not_nan)
1

Chúng tôi có thể xác minh rằng các loại bây giờ khác nhau:

from math import isnan
from datatest import validate


data = [5, 6, float('nan')]

def not_nan(x):
    """Values should not be NaN."""
    return not isnan(x)

validate(data, not_nan)
2

Nói chung, không an toàn khi cho rằng Nan là Nan. Điều này có nghĩa là để xác nhận đáng tin cậy, tốt nhất là loại bỏ các bản ghi NAN hoàn toàn hoặc thay thế chúng bằng một số giá trị khác.

Làm cách nào để sửa lỗi NAN trong Python?

Chúng ta có thể thay thế các giá trị NAN bằng 0 để loại bỏ các giá trị NAN. Điều này được thực hiện bằng cách sử dụng hàm fillna (). Hàm này sẽ kiểm tra các giá trị NAN trong các cột DataFrame và điền vào giá trị đã cho.replace NaN values with 0 to get rid of NaN values. This is done by using fillna() function. This function will check the NaN values in the dataframe columns and fill the given value.

Tại sao tôi tiếp tục nhận được Nan?

Không một số (NAN) được đưa ra khi cố gắng thực hiện các tính toán trên một phần của một mảng không được khởi tạo. Ví dụ: nếu bạn có mảng sau: nếu bạn thử và tìm giá trị trung bình của mảng này thì bạn sẽ thấy rằng kết quả sẽ là NAN. Điều này là do nó đang cố gắng tìm giá trị trung bình của không có gì.. For example, if you have the following array: If you try and find the mean of this array then you will find that the results will be NaN. This is because it is trying to find the mean value of nothing.

Làm thế nào để bạn tránh các giá trị NAN trong Python?

Các bước để thay thế các giá trị NAN:..
Cho một cột bằng cách sử dụng gấu trúc: df ['cột dataFrame'] = df ['cột dataFrame']. Fillna (0).
Cho một cột bằng cách sử dụng numpy: df ['cột dataFrame'] = df ['cột dataFrame']. Thay thế (np.nan, 0).
Đối với toàn bộ khung dữ liệu bằng cách sử dụng gấu trúc: df.fillna (0).
Đối với toàn bộ dữ liệu sử dụng numpy: df.replace (np.nan, 0).

Làm thế nào để tôi thoát khỏi Nan trong gấu trúc?

Bằng cách sử dụng phương thức dropna (), bạn có thể thả các hàng với NAN (không phải là số) và không có giá trị nào từ Pandas DataFrame.Lưu ý rằng theo mặc định, nó trả về bản sao của DataFrame sau khi xóa hàng.Nếu bạn muốn xóa khỏi DataFrame hiện có, bạn nên sử dụng tại chỗ = true. you can drop rows with NaN (Not a Number) and None values from pandas DataFrame. Note that by default it returns the copy of the DataFrame after removing rows. If you wanted to remove from the existing DataFrame, you should use inplace=True .