Panda DataFrame'de herhangi bir değerin NaN olup olmadığını kontrol etme


Yanıtlar:


577

jwilner'ın yanıtı açık. Daha hızlı bir seçenek olup olmadığını araştırıyordum, çünkü tecrübelerime göre, düz dizileri toplamak (garip bir şekilde) saymaktan daha hızlı. Bu kod daha hızlı görünüyor:

df.isnull().values.any()

Örneğin:

In [2]: df = pd.DataFrame(np.random.randn(1000,1000))

In [3]: df[df > 0.9] = pd.np.nan

In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop

In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop

In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop

In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 µs per loop

df.isnull().sum().sum()biraz daha yavaş, ama tabii ki, ek bilgi var - sayısı NaNs.


1
Zaman kriterleri için teşekkürler. Bunun pandasiçin yerleşik bir fonksiyona sahip olmaması şaşırtıcı . @ JGreenwell'in gönderisinden bunu df.describe()yapabilir, ancak doğrudan işlev yoktur.
hlin117

2
Sadece zamanladım df.describe()( NaNs bulmadan ). 1000 x 1000 dizisi ile tek bir arama 1,15 saniye sürer.
hlin117

3
: 1, Ayrıca, df.isnull().values.sum()biraz daha hızlıdf.isnull().values.flatten().sum()
Sıfır

Ah, iyi yakalama @JohnGalt - Poster için kaldırmak .flatten()için çözümümü değiştireceğim. Teşekkürler.
S Anand

6
Denemedin df.isnull().values.any(), benim için diğerlerinden daha hızlı.
CK1

178

Birkaç seçeneğin var.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,6))
# Make a few areas have NaN values
df.iloc[1:3,1] = np.nan
df.iloc[5,3] = np.nan
df.iloc[7:9,5] = np.nan

Şimdi veri çerçevesi şuna benzer:

          0         1         2         3         4         5
0  0.520113  0.884000  1.260966 -0.236597  0.312972 -0.196281
1 -0.837552       NaN  0.143017  0.862355  0.346550  0.842952
2 -0.452595       NaN -0.420790  0.456215  1.203459  0.527425
3  0.317503 -0.917042  1.780938 -1.584102  0.432745  0.389797
4 -0.722852  1.704820 -0.113821 -1.466458  0.083002  0.011722
5 -0.622851 -0.251935 -1.498837       NaN  1.098323  0.273814
6  0.329585  0.075312 -0.690209 -3.807924  0.489317 -0.841368
7 -1.123433 -1.187496  1.868894 -2.046456 -0.949718       NaN
8  1.133880 -0.110447  0.050385 -1.158387  0.188222       NaN
9 -0.513741  1.196259  0.704537  0.982395 -0.585040 -1.693810
  • Seçenek 1 : df.isnull().any().any()- Bu bir boole değeri döndürür

isnull()Hangisinin böyle bir veri çerçevesini döndüreceğini biliyorsunuz :

       0      1      2      3      4      5
0  False  False  False  False  False  False
1  False   True  False  False  False  False
2  False   True  False  False  False  False
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True  False  False
6  False  False  False  False  False  False
7  False  False  False  False  False   True
8  False  False  False  False  False   True
9  False  False  False  False  False  False

Bunu yaparsanız df.isnull().any(), yalnızca NaNdeğerleri olan sütunları bulabilirsiniz :

0    False
1     True
2    False
3     True
4    False
5     True
dtype: bool

Bir tanesi .any()size yukarıdakilerden herhangi birininTrue

> df.isnull().any().any()
True
  • Seçenek 2 : df.isnull().sum().sum()- Bu, toplam değer sayısının bir tamsayısını döndürür NaN:

Bu .any().any(), önce NaNbir sütundaki değerlerin toplamını, ardından bu değerlerin toplamını vererek, yaptığı gibi çalışır :

df.isnull().sum()
0    0
1    2
2    0
3    1
4    0
5    2
dtype: int64

Son olarak, DataFrame içindeki toplam NaN değeri sayısını elde etmek için:

df.isnull().sum().sum()
5

Neden .any(axis=None)yerine kullanmıyorsunuz .any().any()?
Georgy

57

Belirli bir sütunda hangi satırların NaN'leri olduğunu bulmak için:

nan_rows = df[df['name column'].isnull()]

17
Belirli bir sütunda NaN'ler yok hangi satırların öğrenmek için: non_nan_rows = df[df['name column'].notnull()].
Elmex80s

49

"Bir veya daha fazla NaNs" ile kaç satır olduğunu bilmeniz gerekiyorsa :

df.isnull().T.any().T.sum()

Veya bu satırları çıkarmanız ve incelemeniz gerekiyorsa:

nan_rows = df[df.isnull().T.any().T]

4
Sanırım 2. T'ye ihtiyacımız yok
YOBEN_S


18

Hobs'un parlak cevabına ek olarak, Python ve Pandalar için çok yeniyim, bu yüzden lütfen yanlış olduğumu belirtin.

Hangi satırların NaN'leri olduğunu bulmak için:

nan_rows = df[df.isnull().any(1)]

satırlarda 'Doğru' olup olmadığını kontrol etmek için herhangi bir () eksenini 1 olarak belirterek aktarmaya gerek kalmadan aynı işlemi gerçekleştirir.


Bu iki dönüşümden kurtulur ! Özlü any(axis=1)sadeliğinizi seviyorum .
Ocaklar

12

Süper Basit Sözdizimi: df.isna().any(axis=None)

V0.23.2 başlayarak kullanabileceğiniz DataFrame.isna+ DataFrame.any(axis=None)nerede axis=Nonebelirtir, tüm DataFrame üzerinde mantıksal azaltma.

# Setup
df = pd.DataFrame({'A': [1, 2, np.nan], 'B' : [np.nan, 4, 5]})
df
     A    B
0  1.0  NaN
1  2.0  4.0
2  NaN  5.0

df.isna()

       A      B
0  False   True
1  False  False
2   True  False

df.isna().any(axis=None)
# True

Yararlı Alternatifler

numpy.isnan
Pandaların eski sürümlerini çalıştırıyorsanız başka bir performans seçeneği.

np.isnan(df.values)

array([[False,  True],
       [False, False],
       [ True, False]])

np.isnan(df.values).any()
# True

Alternatif olarak, toplamı kontrol edin:

np.isnan(df.values).sum()
# 2

np.isnan(df.values).sum() > 0
# True

Series.hasnans
Ayrıca yinelemeli olarak da arayabilirsiniz Series.hasnans. Örneğin, tek bir sütunda NaN olup olmadığını kontrol etmek için,

df['A'].hasnans
# True

Ve herhangi bir sütunda NaN olup olmadığını kontrol etmek için any(kısa devre olan bir işlemdir) ile bir kavrama kullanabilirsiniz .

any(df[c].hasnans for c in df)
# True

Bu aslında çok hızlı.


10

Hiçbiri bahsetmediği için, sadece denilen başka bir değişken vardır hasnans.

df[i].hasnansTruepanda Serisindeki değerlerden biri veya daha fazlası NaN Falseise (değilse) çıktısı verir . Bunun bir işlev olmadığını unutmayın.

pandalar sürümü '0.19.2' ve '0.20.2'


6
Bu cevap yanlış. Pandalar Serisi bu özelliğe sahiptir, ancak DataFrames yoktur. Eğer df = DataFrame([1,None], columns=['foo']), o df.hasnanszaman bir atar AttributeError, ama df.foo.hasnansgeri döner True.
Nathan Thompson

7

Bunu pandasbulmak için beri , DataFrame.dropna()nasıl uyguladıklarını görmek için bir göz attım ve kullandıklarını keşfettim DataFrame.count(), ki bu tüm null olmayan değerleri sayar DataFrame. Krş pandalar kaynak kodu . Bu tekniği karşılaştırmadım, ancak kütüphane yazarlarının bunu nasıl yapacağına dair akıllıca bir seçim yaptıklarını düşünüyorum.


6

Izin vermek dfPandalar DataFrame adı ve herhangi bir değer numpy.nannull değer.

  1. Hangi sütunlarda null değerlerinin hangilerinin null olduğunu görmek istiyorsanız (yalnızca Doğru ve Yanlış)
    df.isnull().any()
  2. Yalnızca null değeri olan sütunları görmek istiyorsanız
    df.loc[:, df.isnull().any()].columns
  3. Her sütunda null sayısını görmek istiyorsanız
    df.isna().sum()
  4. Her sütunda boş değerlerin yüzdesini görmek istiyorsanız

    df.isna().sum()/(len(df))*100
  5. Boş değerlerin yüzdesini yalnızca boş değerli sütunlarda görmek istiyorsanız: df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100

DÜZENLEME 1:

Verilerinizin görsel olarak nerede eksik olduğunu görmek istiyorsanız:

import missingno
missingdata_df = df.columns[df.isnull().any()].tolist()
missingno.matrix(df[missingdata_df])

Her sütundaki sıfır sayısını görmek istiyorsanız ... Bu çılgınca görünüyor, neden sadece yapmıyorsunuz df.isna().sum()?
AMC

4

Sadece math.isnan (x) kullanarak , x bir NaN (sayı değil) ise True döndür , aksi halde False.


4
Sanmıyorum math.isnan(x)zaman işe gidiyor xbir DataFrame olduğunu. Bunun yerine bir TypeError alırsınız.
hlin117

Bunu neden alternatiflerden herhangi birinde kullanasınız?
AMC

4
df.isnull().sum()

Bu, DataFrame'in ilgili renklerinde bulunan tüm NaN değerlerinin sayısını verecektir.


Hayır, bu size sütun adlarını karşılık gelen NA değerleriyle eşleyen bir Seri verecektir.
AMC

Düzeltildi, benim hatam: p
Adarsh ​​singh

3

İşte boş bulmanın ve hesaplanmış bir değerle değiştirmenin ilginç bir yolu

    #Creating the DataFrame

    testdf = pd.DataFrame({'Tenure':[1,2,3,4,5],'Monthly':[10,20,30,40,50],'Yearly':[10,40,np.nan,np.nan,250]})
    >>> testdf2
       Monthly  Tenure  Yearly
    0       10       1    10.0
    1       20       2    40.0
    2       30       3     NaN
    3       40       4     NaN
    4       50       5   250.0

    #Identifying the rows with empty columns
    nan_rows = testdf2[testdf2['Yearly'].isnull()]
    >>> nan_rows
       Monthly  Tenure  Yearly
    2       30       3     NaN
    3       40       4     NaN

    #Getting the rows# into a list
    >>> index = list(nan_rows.index)
    >>> index
    [2, 3]

    # Replacing null values with calculated value
    >>> for i in index:
        testdf2['Yearly'][i] = testdf2['Monthly'][i] * testdf2['Tenure'][i]
    >>> testdf2
       Monthly  Tenure  Yearly
    0       10       1    10.0
    1       20       2    40.0
    2       30       3    90.0
    3       40       4   160.0
    4       50       5   250.0

3

Aşağıdaki kullanarak ve bir dizeye döküm ve nan değeri kontrol yazın

   (str(df.at[index, 'column']) == 'nan')

Bu, bir serideki belirli bir değeri kontrol etmeme ve sadece serinin içinde bir yerde bulunuyorsa geri dönmeme izin vermez.


Bunu kullanmanın bir avantajı var mı pandas.isna()?
AMC

2

En iyisi kullanmak olacaktır:

df.isna().any().any()

İşte nedeni . Yani isna()tanımlamak için kullanılır isnull(), ancak bunların her ikisi de elbette aynıdır.

Bu, kabul edilen yanıttan daha hızlıdır ve tüm 2D panda dizilerini kapsar.


1

Veya .info()aşağıdaki DFgibi kullanabilirsiniz :

df.info(null_counts=True) bu, aşağıdaki gibi bir sütundaki boş olmayan satırların sayısını döndürür:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 3276314 entries, 0 to 3276313
Data columns (total 10 columns):
n_matches                          3276314 non-null int64
avg_pic_distance                   3276314 non-null float64


0
df.apply(axis=0, func=lambda x : any(pd.isnull(x)))

Her sütunu Nan içerip içermediğini kontrol eder.


Bunu neden yerleşik çözümlerden herhangi birinde kullanıyorsunuz?
AMC

0

Biz Seaborn modülü kullanılarak ısı haritası üreterek veri kümesi içinde boş değerler mevcut görebilir ısı haritası

import pandas as pd
import seaborn as sns
dataset=pd.read_csv('train.csv')
sns.heatmap(dataset.isnull(),cbar=False)

-1

Sadece herhangi bir 'NaN' olup olmadığını kontrol etmekle kalmaz, aynı zamanda aşağıdakileri kullanarak her bir sütundaki 'NaN'lerin yüzdesini de elde edebilirsiniz,

df = pd.DataFrame({'col1':[1,2,3,4,5],'col2':[6,np.nan,8,9,10]})  
df  

   col1 col2  
0   1   6.0  
1   2   NaN  
2   3   8.0  
3   4   9.0  
4   5   10.0  


df.isnull().sum()/len(df)  
col1    0.0  
col2    0.2  
dtype: float64

-2

Karşılaştığınız veri türüne bağlı olarak, EDA'nızı gerçekleştirirken dropna'yı False olarak ayarlayarak her bir sütunun değer sayısını da elde edebilirsiniz.

for col in df:
   print df[col].value_counts(dropna=False)

Çok sayıda benzersiz değeriniz olduğunda kategorik değişkenler için iyi çalışır.


Bence bu verimsiz. Pandaların yerleşik işlevleri daha temiz / düzenlidir. Ipython not defterinin dağınıklığını önler.
Koo

Bunu yerleşik çözümler üzerinde kullanmanın bir anlamı yok.
AMC
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.