Python / numpy / pandas'ta rastgele nesnenin NaN olup olmadığını verimli bir şekilde kontrol etmek?


101

Benim numpy dizilerim np.naneksik değerleri belirtmek için kullanır . Veri seti üzerinde yinelediğimde, bu tür eksik değerleri tespit etmem ve bunları özel yollarla ele almam gerekiyor.

Naively kullandım numpy.isnan(val), valdesteklenen türlerin alt kümeleri arasında olmadığı sürece iyi çalışıyor numpy.isnan(). Örneğin, dize alanlarında eksik veriler oluşabilir, bu durumda şunu elde ederim:

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

İstisnaları ve geri dönüşleri yakalayan pahalı bir paketleyici yazmaktan başka False, bunu zarif ve verimli bir şekilde halletmenin bir yolu var mı?


8
pandashas pandas.isnull(): Bunun ihtiyaçlarınızı karşılayıp karşılamadığından emin değilim, bu nedenle bazı örnek veriler iyi olabilir.
Marius

4
@Marius: pandas.isnull()mükemmel çalışıyor gibi görünüyor. Şu anda uğraştığım tek veri türü numpy.isnan()dizedir ve pandas.isnull()onu iyi idare eder. Aslında, ona fırlattığım tüm rastgele nesneleri iyi idare ediyor gibi görünüyor. Endişe ettiğiniz belirli sorunlar var mıydı? Aksi takdirde, en azından pandalar için kanonik bir cevap gibi göründüğü için yorumunuzu tam teşekküllü bir cevap olarak göndermek isteyebilirsiniz.
Dun Peal

Yanıtlar:


169

pandas.isnull()(ayrıca pd.isna(), daha yeni sürümlerde) hem sayısal hem de dize / nesne dizilerindeki eksik değerleri kontrol eder. Belgelerden şunları kontrol eder:

Sayısal dizilerde NaN, nesne dizilerinde Yok / NaN

Hızlı örnek:

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.nanEksik değerleri temsil etmek için kullanma fikri ortaya çıkan bir şeydir pandas, bu yüzdenpandas bununla başa çıkacak araçlara sahiptir.

Veri zamanları da (kullanırsanız pd.NaT, dtype belirtmeniz gerekmez)

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

Tipiniz gerçekten keyfi mi? Bunun bir int float veya string olacağını biliyorsanız,

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

numpy ile sarıldığını varsayarsak, her zaman bir dtype'ye sahip olacaktır ve yalnızca float ve complex NaN olabilir


Pek çok farklı veri türüyle uğraşıyorum. Çoğu sütunda int * veya float * veri türleri varken, diğerleri herhangi bir nesne olabilir, ancak şimdiye kadar kullandığım diğer tek tür string idi.
Dun Peal

Python'daki dizeler yoktur dtype. Yapmanız gerekebilirtype(val) == 'float'
pvarma

4
type(val) == float and np.isnan(val)- benim için çalıştı
Danny Cullen

@ user1930402 Bunların sıradan python dizileri olmadığını varsayıyorum. Örneğin: np.array (["merhaba"]) [0] .dtype çalışıyor ancak ["merhaba"] [0] .dtype çalışmıyor
Hammer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.