NaN ve None arasındaki fark nedir?


97

Pandaları kullanarak bir csv dosyasının iki sütununu okuyorum readcsv()ve ardından değerleri bir sözlüğe atıyorum . Sütunlar, sayı ve harf dizilerini içerir. Bazen bir hücrenin boş olduğu durumlar vardır. Bana göre, o sözlük girişine okunan değer olmalı Noneama onun yerine nanatanmıştır. Elbette None, boş bir hücreye sahip olduğu için daha açıklayıcıdır, oysa nansadece okunan değerin bir sayı olmadığını söyler.

Anladığım doğru mu, Noneve arasındaki fark nannedir? nanBunun yerine neden atanır None?

Ayrıca, sözlüğümde boş hücre olup olmadığını kontrol et numpy.isnan():

for k, v in my_dict.iteritems():
    if np.isnan(v):

Ama bu bana bu çeki kullanamayacağımı söyleyen bir hata veriyor v. Sanırım bunun nedeni bir tamsayı veya kayan değişken, bir dizenin değil kullanılmasıdır. Bu doğruysa, v"boş hücre" / nankasa olup olmadığını nasıl kontrol edebilirim ?


Metin qwertybir sayı değil.
Robert Harvey

1
@RobertHarvey Biliyorum, bu yüzden kesinlikle Noneboş bir hücrenin değerinin daha iyi bir açıklaması olurdu.
user1083734

Yanıtlar:


110

NaN, pandalarda sürekli olarak eksik veri için yer tutucu olarak kullanılır , tutarlılık iyidir. Genellikle NaN'yi "eksik" olarak okurum / tercüme ederim . Ayrıca dokümanlardaki 'eksik verilerle çalışma' bölümüne bakın.

Wes, belgelerde 'NA-temsili seçimi' yazıyor :

Yıllarca süren üretimden sonra [NaN] kullanımı, en azından bence, NumPy ve Python'daki genel durum göz önüne alındığında en iyi karar olduğunu kanıtladı. NaN (Not-A-Number) değeri, her yerde NA değeri olarak kullanılır ve API işlevleri vardır isnullve notnullbunlar, NA değerlerini tespit etmek için dtype'lerde kullanılabilir.
...
Bu nedenle, Pythonic “pratiklik saflığı yener” yaklaşımını seçtim ve şamandıra ve nesne dizilerinde NA'yı belirtmek için özel bir değer kullanmak ve NA'lar olması gerektiğinde tamsayı dizilerini yüzmeye teşvik etmek gibi çok daha basit bir yaklaşım için tamsayı NA yeteneğini seçtim. tanıtıldı.

Not: Eksik verileri içeren tamsayı Serilerinin yüzer sayıya yükseltildiğini "yakaladım" .

Bence temel nedeni (Hiçbiri üzerinden) NaN kullanmak oldukça az verimli nesne d_type daha, numpy en float64 d_type ile saklanabilir olmasıdır bkz promosyonlar yazın NA .

#  without forcing dtype it changes None to NaN!
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])

In [13]: s_bad.dtype
Out[13]: dtype('O')

In [14]: s_good.dtype
Out[14]: dtype('float64')

Jeff bu konuda yorum yapıyor (aşağıda):

np.nanvektörleştirilmiş işlemlere izin verir; onun bir float değeri, Nonetanımı gereği nesne tipini zorlar, bu da temelde numpy'deki tüm verimliliği devre dışı bırakır.

Bu yüzden 3 kez hızlı tekrarlayın: nesne == kötü, float == iyi

Bunu söyleyerek, birçok işlem hala Yok ve NaN ile aynı şekilde çalışabilir (ancak belki desteklenmez, yani bazen şaşırtıcı sonuçlar verebilirler ):

In [15]: s_bad.sum()
Out[15]: 1

In [16]: s_good.sum()
Out[16]: 1.0

: İkinci soruya cevap vermek için
kullanarak gerektiğini pd.isnullve pd.notnull(NaN) verileri eksik test etmek.


19
buraya sadece 2c eklemek .... np.nanvektörleştirilmiş işlemlere izin verir; ise onun bir reel değer, Nonetanım kuvvetleri tarafından objecttürü ve temelde Numpy tüm verimliliği devre dışı bırakır, bu kadar hızlı 3 kez tekrar:object==bad, float==good
Jeff

1
<NA>bir de np.nan?
Gathide

18

NaNmatematiksel işlemlerde sayısal bir değer olarak kullanılabilirken kullanılamaz None(veya en azından olmamalıdır).

NaNIEEE 754 kayan nokta standardında tanımlandığı gibi sayısal bir değerdir . Nonedahili bir Python türüdür ( NoneType) ve bu bağlamda "sayısal olarak geçersiz" yerine "var olmayan" veya "boş" gibi olacaktır.

Bunun ana "semptomu", örneğin NaN içeren bir dizide ortalama veya toplam gerçekleştirirseniz, tek bir tane bile NaN elde edersiniz ...

Öte yandan, Noneişlenen olarak kullanarak matematiksel işlemler gerçekleştiremezsiniz .

Dolayısıyla, duruma bağlı olarak, Nonealgoritmanıza hesaplamalarda geçersiz veya var olmayan değerleri dikkate almamasını söylemenin bir yolu olarak kullanabilirsiniz . Bu, algoritmanın her bir değeri test edip etmediğini görmek için test etmesi gerektiği anlamına gelir None.

Numpy, örneğin nansumve gibi NaN değerlerinin sonuçlarınızı kirletmesini önlemek için bazı işlevlere sahiptir nan_to_num.


Ben bu yüzden neden yok, sen misin Yok varolmayan girişler için kullanılması gerektiğini katılıyorum df=pd.readcsv('file.csv')bana ver NaNboş hücreler için değerler değil None? Bildiğim kadarıyla pd.DataFrame'ler sayılara özel değildir.
user1083734

Muhtemelen bir tasarım seçimi. Ben DataFrames varsayalım ve Seri bir var dtype, bu nedenle geçersiz değerleri dtype=floatsayısal değerler tarafından temsil edilmelidir NaNve None(değil Nonetaşımaktadır NoneType).
heltonbiker

Ayrıca Pandalar yöntemlerinin bir sürü var nasen değil-kullanılabilir değerleri değiştirmek için kullanacağız hangi değeri karar versin argüman,
heltonbiker

Tamam teşekkürler. Yani aslında DataFrame'ime sayıları değil, sayı ve harf dizilerini okuyorum. Boş hücreleri tespit etmek için ne tür bir kontrol kullanmalıyım? Bir çek; dtype == float ise: ??
user1083734

Belki CSV verilerinizin bir örneğini yayınlamak yardımcı olabilir. Dizeler varsa, dtype'ın tüm sütun (Series) için dize olacağını hayal edebiliyorum. Ancak belki de her satırda aynı sayıda sütun yoksa, sonuçta kullanılamayan verilerle karşılaşırsınız. Sanırım bunu kontrol etmeniz gerekecek.
heltonbiker

3

İşlev isnan(), bir şeyin "Sayı Değil" olup olmadığını kontrol eder ve bir değişkenin sayı olup olmadığını döndürür, örneğin isnan(2)yanlış döndürür

Koşullu myVar is not None, değişkenin tanımlanmış olup olmadığını döndürür

Numpy diziniz, isnan()bir sayı dizisi olması amaçlandığı için kullanır ve dizinin tüm öğelerini NaNbu öğelere göre başlatır "boş"


1
2 bir NaN olmadığı için isnan(2)döneceğini düşünüyorum False.
heltonbiker

Ayrıca, numpy.emptydizi değerlerini NaN. Değerleri hiç başlatmaz.
heltonbiker

5
None-Ness için doğru kontrol myVar is not None, değil myVar != None.
Jaime

3
Bunun np.isnan()dize değişkenleri için uygulanmadığına dikkat edin, bu nedenle bir dize geçirirseniz çökecektir. pd.isnullDizelerle çalışan kullanmak daha iyidir.
Michael

-1

Farklılıklar aşağıdadır:

  • nan sınıfa aittir float
  • None sınıfa aittir NoneType

Aşağıdaki makaleyi çok yararlı buldum: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31


Bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değişirse yalnızca bağlantı yanıtları geçersiz hale gelebilir. - Yorumdan
A. Kootstra

@ A.Kootstra Anlıyorum
eswara amirthan s

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.