Pandaları veya Numpy Nan'ı MysqlDB ile kullanmak için Hiçbiri ile değiştirme


128

MysqlDB kullanarak bir mysql veritabanına bir Pandas veri çerçevesi yazmaya (veya bir numpy dizisi kullanabilir) çalışıyorum. MysqlDB, 'nan'ı anlamıyor gibi görünüyor ve veritabanım nan'ın alan listesinde olmadığını söyleyen bir hata veriyor. 'Nan'ı NoneType'a dönüştürmenin bir yolunu bulmam gerekiyor.

Herhangi bir fikir?


2
Pandaların yerine geri döndürmek Noneiçin değiştirebileceğiniz bir ayar yok mu? NULLnan
Nathan Hinchey

Yanıtlar:


195

@bogatron haklı, kullanabilirsiniz where, bunu pandalarda yerel olarak yapabileceğinizi belirtmekte fayda var:

df1 = df.where(pd.notnull(df), None)

Not: Bu, tüm sütunların dtype değerini olarak değiştirir object.

Misal:

In [1]: df = pd.DataFrame([1, np.nan])

In [2]: df
Out[2]: 
    0
0   1
1 NaN

In [3]: df1 = df.where(pd.notnull(df), None)

In [4]: df1
Out[4]: 
      0
0     1
1  None

Not: dtypeKullanarak astypeve ardından DataFrame fillnayöntemini kullanarak tüm veri türü türlerine izin vermek için DataFrames'i yeniden biçimlendiremeyeceğiniz şey :

df1 = df.astype(object).replace(np.nan, 'None')

Maalesef ne bu, ne de kullanarak replace, birlikte çalışmaları Nonebkz bu (kapalı) sorunu .


Bir kenara, çoğu kullanım durumu için NaN'yi Yok ile değiştirmeniz gerekmediğini belirtmekte fayda var , pandalarda NaN ve Yok arasındaki fark hakkındaki bu soruya bakın .

Ancak, bu özel durumda öyle görünüyor (en azından bu cevabın verildiği sırada).



1
FWIW..bu ayrıca sütunların tipini nesneye değiştirecek, muhtemelen umursamıyorsunuz
Jeff

@Jeff Bağlantı için teşekkürler, tuhaf bir şekilde daha önce bulamadım! Hiçbirine izin vermek için dtype'ı değiştirmesi gerektiğini düşündüm, kesinlikle bahsetmeye değer!
Andy Hayden

np.nandizgeye dönüştürülmekten kaçınmak için Django ile eklemeden önce kullanmak yararlıdır"nan"
shadi

Yararlı uyarı. Yalnızca halihazırda dtypeolan sütunlar arasında döngü yapmak mantıklıdır objectve bunu bunlar için yapar ve gerektiğinde diğer türleri farklı şekilde ele alır. İdeal olarak, fillna(None)harika olur.
Vishal


17

Numpy dizinizde nanile değiştirebilirsiniz None:

>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>

2
Sadece potansiyel endişe değişimidir dtype, x.dtypebir dtype('float64')süre y.dtypeolduğunu dtype('object').
Jaime

10

Etrafta tökezledikten sonra, bu benim için çalıştı:

df = df.astype(object).where(pd.notnull(df),None)

4

@Andy Hayden'ın cevabına bir ek:

'İn DataFrame.maskzıt ikizi olduğu DataFrame.whereiçin, tamamen aynı imzaya sahipler, ancak zıt anlamı var:

  • DataFrame.wherekoşulun False olduğu değerleri değiştirmek için kullanışlıdır .
  • DataFrame.maskkoşul True olduğunda değerleri değiştirmek için kullanılır .

Yani bu soruda kullanmak df.mask(df.isna(), other=None, inplace=True)daha sezgisel olabilir.


2

Bir başka ekleme: katları değiştirilmesi ve kolon arka dönüştürdükten dikkatli olmak nesne için şamandıra . @ Andy-hayden'in kullanım önerisine 's uygula'ya Nonegeri dönmeyeceğinden emin olmak istiyorsanız . Değiştirmenin nasıl hala 'yanlış' olabileceğine dair örneknp.NaNpd.where

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})

In [4]: df
Out[4]:
     a
0  1.0
1  NaN
2  inf

In [5]: df.replace({np.NAN: None})
Out[5]:
      a
0     1
1  None
2   inf

In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
     a
0  1.0
1  NaN
2  NaN

In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
     a
0  1.0
1  NaN
2  NaN

Bunu eklediğiniz için teşekkürler. Belgelerin üzerinden tekrar geçerken, bu davranışı hala anlayamıyorum. Her neyse, bu başka bir zincir .replace({np.nan: None})
oluşturarak çözülebilir

1
Evet, başka bir tane ekleyerek bitirebilirsiniz replace({np.nan: None}). Yorumum, np.nan's değiştirilirken olası tehlikeye işaret etmek için eklendi . Yukarıdakiler kesinlikle beni biraz şaşırttı!
gaatjeniksaan

1

Oldukça eski, yine de aynı konuya rastladım. Bunu yapmayı dene:

df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)

Sütun veri türü sayısal ise çalışmaz çünkü Yok sadece nan'ye dönüştürülür (pandalar 0.23)
shadi
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.