Numpy isnan () ล้มเหลวในอาร์เรย์ของโฟลต (จากฐานข้อมูลแพนด้าใช้)


108

ฉันมีอาร์เรย์ของโฟลต (ตัวเลขปกติ, nans บางตัว) ที่ออกมาจากการใช้กับดาต้าเฟรมของแพนด้า

ด้วยเหตุผลบางประการ numpy.isnan ล้มเหลวในอาร์เรย์นี้อย่างไรก็ตามตามที่แสดงด้านล่างแต่ละองค์ประกอบเป็นแบบลอย numpy.isnan ทำงานอย่างถูกต้องในแต่ละองค์ประกอบประเภทของตัวแปรคืออาร์เรย์จำนวนนับ

เกิดอะไรขึ้น?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray

คำตอบ:


176

np.isnan สามารถนำไปใช้กับอาร์เรย์ NumPy ของ dtype ดั้งเดิม (เช่น np.float64):

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

แต่เพิ่ม TypeError เมื่อใช้กับอาร์เรย์วัตถุ:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

เนื่องจากคุณมี Pandas คุณสามารถใช้pd.isnullแทนได้ - สามารถรับอาร์เรย์ NumPy ของวัตถุหรือ dtypes ดั้งเดิมได้:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

โปรดทราบว่าNoneยังถือว่าเป็นค่าว่างในอาร์เรย์วัตถุ


3
ขอบคุณ - ใช้ pd.isnull () ดูเหมือนจะไม่มีผลกระทบต่อประสิทธิภาพใด ๆ
tim654321

12

การแทนที่ที่ดีสำหรับ np.isnan () และ pd.isnull () คือ

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

เนื่องจากน่านเท่านั้นไม่เท่ากับตัวมันเอง


ที่อาจใช้ไม่ได้กับอาร์เรย์เนื่องจากทำให้ "ValueError: ค่าความจริงของ xxx มีความคลุมเครือ" ที่รู้จักกันดี
MSeifert

@MSeifert คุณพูดถึงpythonหรือเปล่า? ฉันใช้วิธีนี้เพื่อทำบางสิ่งในแมชชีนเลิร์นนิงทำไมฉันไม่พบข้อผิดพลาดที่รู้จักกันดี
Statham

ใช่ดูเหมือนว่าคุณจะไม่เคยใช้ Numpy หรือ Panda มาก่อน เพียงแค่ใช้import numpy as np; a = np.array([1,2,3, np.nan])และเรียกใช้รหัสของคุณ
MSeifert

@MSeifert เอ่อฉันยังใหม่กับ numpy แต่รหัสทำงานได้ไม่มีข้อผิดพลาดเกิดขึ้น
Statham

ใน [1]: import numpy เป็น np In [2]: a = np.array ([1,2,3, np.nan]) In [3]: print a [1. 2. 3. nan] ใน [ 4]: พิมพ์ [3] == a [3] False
Statham

10

ด้านบนของคำตอบ @unutbu คุณสามารถบังคับอาร์เรย์วัตถุ numpy ของแพนด้าเป็นประเภทเนทีฟ (float64) บางอย่างตามบรรทัด

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

ระบุข้อผิดพลาด = 'coerce' เพื่อบังคับให้สตริงที่ไม่สามารถแยกวิเคราะห์เป็นค่าตัวเลขให้กลายเป็น NaN ประเภทคอลัมน์จะเป็นdtype: float64แล้วisnanตรวจสอบควรใช้งานได้


ชื่อของเขาน่าจะเป็นunutbu;)
Dr_Zaszuś

@ Dr_Zaszuśขอบคุณแก้ไข
Severin Pappadeux

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.