Làm thế nào để python bỏ qua các giá trị nan?

Julia Di Russo

Theo dõi

23 tháng 10 năm 2019

·

6 phút đọc

·

Chỉ dành cho thành viên

Tiết kiệm

Điều hướng địa ngục của NaN trong Python

Tóm tắt để hiểu NaN và xử lý chúng dễ dàng trong dữ liệu của bạn

Tôi gần đây rất đau đầu do NaN gây ra. Mọi lập trình viên đều biết chúng là gì và tại sao chúng xảy ra, nhưng trong trường hợp của tôi, tôi không biết tất cả các đặc điểm của chúng hoặc không đủ hiểu để ngăn chặn cuộc đấu tranh của tôi. Với hy vọng tìm ra giải pháp và tránh phải đau đầu, tôi đã tìm hiểu sâu hơn về hành vi của các giá trị NaN trong Python. Sau khi chơi với một vài câu lệnh trong Jupyter Notebook, kết quả của tôi khá bất ngờ và cực kỳ khó hiểu. Đây là những gì tôi đã sử dụng np. nan từ Numpy.

import numpy as np
one = np.nan
two = np.nan
one is two
7 là
import numpy as np
one = np.nan
two = np.nan
one is two
8

Cho đến nay rất tốt, được nhưng…

import numpy as np
one = np.nan
two = np.nan
one is two
9 là
import numpy as np
one = np.nan
two = np.nan
one is two
0

Huh?

import numpy as np
one = np.nan
two = np.nan
one is two
0 là
import numpy as np
one = np.nan
two = np.nan
one is two
8

Vậy cái quái gì đang xảy ra với NaN trong Python?

Giới thiệu ngắn

NaN là viết tắt của Not A Number và là một biểu diễn dữ liệu bị thiếu phổ biến. Đó là một giá trị dấu phẩy động đặc biệt và không thể chuyển đổi thành bất kỳ loại nào khác ngoài float. Nó được giới thiệu bởi Tiêu chuẩn IEEE về Dấu phẩy động nhị phân cho số học [IEEE 754] trước khi Python tồn tại và được sử dụng trong tất cả các hệ thống tuân theo tiêu chuẩn này. NaN có thể được coi như một loại virus dữ liệu lây nhiễm tất cả các hoạt động mà nó chạm vào

Không so với NaN

Không có gì và NaN nghe có vẻ giống nhau, trông giống nhau nhưng thực ra lại khá khác nhau. Không có loại nội bộ Python nào có thể được coi là tương đương với NULL. Từ khóa

import numpy as np
one = np.nan
two = np.nan
one is two
2 được sử dụng để xác định giá trị null hoặc không có giá trị nào cả. Không có gì không giống như 0, Sai hoặc một chuỗi rỗng. Nó là một kiểu dữ liệu của riêng nó [NoneType] và chỉ có thể là Không có… Không có. Mặc dù các giá trị bị thiếu là NaN trong mảng số, nhưng chúng là Không có trong mảng đối tượng. Tốt nhất là kiểm tra Không có bằng cách sử dụng
import numpy as np
one = np.nan
two = np.nan
one is two
3 thay vì
import numpy as np
one = np.nan
two = np.nan
one is two
4. Chúng tôi quay lại vấn đề trước với kết quả đặc biệt mà tôi tìm thấy trong các hoạt động NaN của mình

nan KHÔNG bằng nan

Lúc đầu, đọc rằng

import numpy as np
one = np.nan
two = np.nan
one is two
9 là
import numpy as np
one = np.nan
two = np.nan
one is two
0 có thể gây ra phản ứng bối rối và thất vọng. Nó có vẻ kỳ lạ, nghe thực sự kỳ lạ nhưng nếu bạn suy nghĩ một chút, logic sẽ bắt đầu xuất hiện và thậm chí bắt đầu có ý nghĩa.

Mặc dù chúng tôi không biết mọi NaN là gì, nhưng không phải mọi NaN đều giống nhau

Hãy tưởng tượng rằng thay vì các giá trị nan, chúng ta đang xem xét một nhóm người mà chúng ta không biết. Họ là những người hoàn toàn xa lạ với chúng tôi. Những người không quen biết có thể được coi là giống nhau đối với chúng tôi, có nghĩa là chúng tôi mô tả tất cả họ là không biết. Tuy nhiên, trên thực tế không có nghĩa là người không biết này bằng người không biết khác

Để thoát khỏi phép ẩn dụ kỳ lạ này của tôi và quay trở lại Python, NaN không thể bằng chính nó vì NaN là kết quả của một thất bại, nhưng thất bại đó có thể xảy ra theo nhiều cách. Kết quả của một lỗi không thể bằng kết quả của bất kỳ lỗi nào khác và các giá trị chưa biết không thể bằng nhau

Bình đẳng vs Bản sắc

Bây giờ, để hiểu tại sao

import numpy as np
one = np.nan
two = np.nan
one is two
7 lại là
import numpy as np
one = np.nan
two = np.nan
one is two
8, chúng ta phải xem xét sự khác biệt giữa bình đẳng và bản sắc

bình đẳng

Bình đẳng đề cập đến khái niệm mà hầu hết các lập trình viên Python đều biết là “==”. Điều này được sử dụng để hỏi Python xem nội dung của biến có giống với nội dung của biến khác không

num = 1
num2 = 1
num == num2

Dòng cuối cùng sẽ dẫn đến ______28. Nội dung của cả hai biến là như nhau. Như tôi đã nói trước đây, nội dung của NaN không bao giờ bằng nội dung của NaN khác

Xác thực

Danh tính là khi bạn hỏi Python xem một biến có giống với một biến khác không, nghĩa là bạn đang hỏi Python liệu hai biến có cùng một danh tính không. Python gán một id cho mỗi biến được tạo và các id được so sánh khi Python xem xét danh tính của một biến trong một thao tác. Tuy nhiên,

import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True
0 là một đối tượng duy nhất luôn có cùng một id, bất kể bạn gán nó cho biến nào

import numpy as np
one = np.nan
two = np.nan
one is two

import numpy as np
one = np.nan
two = np.nan
one is two
0 là
import numpy as np
one = np.nan
two = np.nan
one is two
8 và
import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True
3 cũng là
import numpy as np
one = np.nan
two = np.nan
one is two
8

Nếu bạn kiểm tra id của

import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True
5 và
import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True
6 bằng cách sử dụng
import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True
7 và
import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True
8 , cùng một id sẽ được hiển thị

import numpy as np
one = np.nan
two = np.nan
one is two
7 là
import numpy as np
one = np.nan
two = np.nan
one is two
8 vì bộ chứa danh sách trong Python kiểm tra danh tính trước khi kiểm tra đẳng thức. Tuy nhiên, nan có những “hương vị” khác nhau tùy thuộc vào cách chúng được tạo ra.
import numpy as np
one = np.nan
two = np.nan
one is two
31 tạo các đối tượng khác nhau với các id khác nhau để
import numpy as np
one = np.nan
two = np.nan
one is two
32 thực sự cho Sai. Chúng tôi sẽ đề cập lại những khác biệt này sau

Xử lý nan mà không đau đầu

Khái niệm nan đầy đủ có thể khá khó nắm bắt và rất khó xử lý lúc đầu. Rất may, gấu trúc và numpy thật tuyệt vời khi xử lý các giá trị nan và mang lại một số hàm sẽ dễ dàng, chọn, thay thế hoặc xóa các giá trị nan trong các biến của bạn

Kiểm tra nếu một giá trị là nan

Như tôi đã nói, bất cứ khi nào bạn muốn biết một giá trị có phải là nan hay không, bạn không thể kiểm tra xem nó có bằng nan hay không. Tuy nhiên, có nhiều tùy chọn khác để làm như vậy và tùy chọn tôi đề xuất không phải là tùy chọn duy nhất hiện có

import numpy as np
import pandas as pd
var = float['nan']var is np.nan #results in True
#or
np.isnan[var] #results in True
#or
pd.isna[var] #results in True
#or
pd.isnull[var]#results in True

import numpy as np
one = np.nan
two = np.nan
one is two
33 &
import numpy as np
one = np.nan
two = np.nan
one is two
34 cư xử giống hệt nhau. Pandas cung cấp. isnull[] vì nó là bản chuyển thể của khung dữ liệu R trong Python. Trong R, null và na là hai loại khác nhau với các hành vi khác nhau

Khác với numpy và kể từ Python 3. 5, bạn cũng có thể sử dụng

import numpy as np
one = np.nan
two = np.nan
one is two
35. Lý do tại sao tôi viết cả nan và NaN trong bài viết này [ngoài lý do tôi thiếu nhất quán] là vì giá trị không phân biệt chữ hoa chữ thường. Cả
import numpy as np
one = np.nan
two = np.nan
one is two
31 hoặc
import numpy as np
one = np.nan
two = np.nan
one is two
37 sẽ cho cùng một kết quả

import numpy as np
one = np.nan
two = np.nan
one is two
3

Một chút cảnh báo

import numpy as np
one = np.nan
two = np.nan
one is two
2

Các câu lệnh đưa ra Sai vì

import numpy as np
one = np.nan
two = np.nan
one is two
38 ,
import numpy as np
one = np.nan
two = np.nan
one is two
39and
import numpy as np
one = np.nan
two = np.nan
one is two
20 tất cả đều có id khác nhau. Họ không có cùng bản sắc

Đối với khung dữ liệu

import numpy as np
one = np.nan
two = np.nan
one is two
6

Thật không may, tôi không thấy tài liệu về gấu trúc cực kỳ hữu ích khi nói đến tài liệu dữ liệu bị thiếu của chúng. Tuy nhiên, tôi thực sự đánh giá cao đoạn trích này từ Sổ tay Khoa học Dữ liệu Python cung cấp một cái nhìn tổng quan tuyệt vời về cách xử lý dữ liệu bị thiếu trong Pandas

Cần chú ý điều gì

LoạiLỗi. đối tượng 'float' không thể lặp lại

Mặc dù lỗi Không có Loại khá rõ ràng, nhưng các lỗi do giá trị nan gây ra có thể hơi khó hiểu. Các giá trị Nan thường có thể gây ra lỗi [cụ thể hơn là TypeErrors] sẽ liên quan đến loại 'float' của chúng. Thông báo lỗi có thể gây ngạc nhiên, đặc biệt khi bạn tin rằng dữ liệu của mình hoàn toàn không có số float. Khung dữ liệu của bạn dường như không bao gồm bất kỳ số float nào, nhưng thực tế, nó thực sự có. Nó có thể có các giá trị NaN mà bạn không biết và bạn chỉ cần loại bỏ các giá trị nan của mình để thoát khỏi lỗi này

Là một nhà khoa học dữ liệu và lập trình viên Python, tôi thích chia sẻ kinh nghiệm của mình trong lĩnh vực này và sẽ tiếp tục viết các bài báo về Python, Machine Learning hoặc bất kỳ phát hiện thú vị nào có thể giúp cuộc sống và nhiệm vụ của lập trình viên khác dễ dàng hơn. Theo dõi tôi trên Medium hoặc Twitter để nhận thông báo về bất kỳ bài viết nào trong tương lai về Python & Khoa học dữ liệu

Python có bỏ qua NaN không?

Hàm Python NumPy nanmean[] được sử dụng để tính giá trị trung bình cộng hoặc trung bình cộng của mảng bỏ qua giá trị NaN . Nếu mảng có giá trị NaN và chúng ta có thể tìm ra giá trị trung bình mà không bị ảnh hưởng bởi giá trị NaN. Theo mặc định, giá trị trung bình/trung bình được lấy trên mảng được làm phẳng, nếu không thì trên trục đã chỉ định.

Python xử lý các giá trị NaN như thế nào?

Nếu có một hàng nhất định bị thiếu dữ liệu, thì bạn có thể xóa toàn bộ hàng với tất cả các tính năng trong hàng đó. axis=1 được sử dụng để thả cột có giá trị `NaN`. axis=0 được sử dụng để thả hàng có giá trị `NaN`. Trong trường hợp này, hãy thấy rằng chúng tôi có thể đạt được độ chính xác cao hơn trước đây

Pandas xử lý giá trị NaN như thế nào?

Đã đến lúc xem các phương pháp khác nhau để xử lý chúng. .
Bỏ hàng hoặc cột có giá trị bị thiếu. .
Bỏ các hàng hoặc cột chỉ có các giá trị bị thiếu. .
Xoá hàng hoặc cột dựa trên giá trị ngưỡng. .
Thả dựa trên một tập hợp con cụ thể của các cột. .
Điền vào một giá trị không đổi. .
Điền vào một giá trị tổng hợp

Pandas có nghĩa là bỏ qua NaN?

pandas mean[] Các điểm chính . By default ignore NaN values and performs mean on index axis.

Chủ Đề