ตรวจสอบอย่างมีประสิทธิภาพว่าวัตถุที่กำหนดเองคือ NaN ใน Python / numpy / pandas หรือไม่?


103

อาร์เรย์จำนวนนับของฉันใช้np.nanเพื่อกำหนดค่าที่ขาดหายไป เมื่อฉันทำซ้ำชุดข้อมูลฉันจำเป็นต้องตรวจจับค่าที่ขาดหายไปและจัดการกับค่าเหล่านั้นด้วยวิธีพิเศษ

อย่างไร้เดียงสาผมใช้numpy.isnan(val)ซึ่งทำงานได้ดียกเว้นในกรณีที่ไม่ได้อยู่ในหมู่ย่อยของประเภทที่สนับสนุนโดยval numpy.isnan()ตัวอย่างเช่นข้อมูลที่ขาดหายไปอาจเกิดขึ้นในช่องสตริงซึ่งในกรณีนี้ฉันจะได้รับ:

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

นอกเหนือจากการเขียนกระดาษห่อหุ้มราคาแพงที่จับข้อยกเว้นและส่งคืนFalseแล้วมีวิธีจัดการสิ่งนี้อย่างหรูหราและมีประสิทธิภาพหรือไม่?


8
pandasมีpandas.isnull(): ฉันไม่แน่ใจว่าตรงกับความต้องการของคุณหรือไม่ดังนั้นข้อมูลตัวอย่างบางส่วนอาจจะดี
Marius

4
@ มาริอุส: pandas.isnull()ดูเหมือนจะทำงานได้อย่างสมบูรณ์แบบ ประเภทข้อมูลเดียวที่ฉันกำลังจัดการกับตัวแบ่งnumpy.isnan()คือสตริงและpandas.isnull()จัดการได้ดี ในความเป็นจริงดูเหมือนว่าจะจัดการกับวัตถุใด ๆ ที่ฉันขว้างใส่โดยพลการได้ดี มีปัญหาเฉพาะที่คุณกังวลหรือไม่? มิฉะนั้นคุณอาจต้องการส่งความคิดเห็นของคุณเป็นคำตอบที่สมบูรณ์เนื่องจากดูเหมือนว่าเป็นคำตอบที่ยอมรับได้อย่างน้อยก็สำหรับผู้ใช้แพนด้า
Dun Peal

คำตอบ:


171

pandas.isnull()( pd.isna()ในเวอร์ชันที่ใหม่กว่า) ตรวจหาค่าที่ขาดหายไปทั้งในอาร์เรย์ตัวเลขและสตริง / อ็อบเจ็กต์ จากเอกสารจะตรวจสอบ:

NaN ในอาร์เรย์ตัวเลขไม่มี / NaN ในอาร์เรย์วัตถุ

ตัวอย่างด่วน:

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

แนวคิดในการใช้numpy.nanเพื่อแสดงค่าที่ขาดหายไปคือสิ่งที่pandasนำมาใช้ซึ่งเป็นเหตุให้pandasมีเครื่องมือในการจัดการกับมัน

วันที่ด้วย (ถ้าคุณใช้pd.NaTคุณไม่จำเป็นต้องระบุประเภท)

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

ประเภทของคุณเป็นไปตามอำเภอใจจริงหรือ? ถ้าคุณรู้ว่ามันจะเป็น int float หรือ string คุณก็ทำได้

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

สมมติว่ามันถูกห่อด้วย numpy มันจะมี dtype เสมอและมีเพียง float และ complex เท่านั้นที่เป็น NaN


ฉันกำลังจัดการกับข้อมูลประเภทต่างๆมากมาย แม้ว่าคอลัมน์ส่วนใหญ่จะมีชนิดข้อมูล int * หรือ float * แต่คอลัมน์อื่น ๆ อาจเป็นวัตถุใด ๆ ก็ได้แม้ว่าประเภทอื่น ๆ ที่ฉันใช้จะเป็นสตริงก็ตาม
Dun Peal

dtypeสตริงในหลามไม่ได้ คุณอาจต้องทำtype(val) == 'float'
pnv

5
type(val) == float and np.isnan(val)- ทำงานให้ฉัน
Danny Cullen

@ user1930402 ฉันสมมติว่าสิ่งเหล่านี้เป็นอาร์เรย์จำนวนนับไม่ใช่ python ปกติ ตัวอย่างเช่น: np.array (["hello"]) [0] .dtype ใช้งานได้ แต่ ["hello"] [0] .dtype ไม่ทำงาน
Hammer

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