2013-01-04 10 views
45

Próbuję zapisać pandasową ramkę danych (lub użyć tablicy numpy) do bazy danych mysql przy użyciu MysqlDB. MysqlDB nie wydaje się rozumieć "nan" i moja baza danych wyrzuca błąd mówiąc, że nan nie znajduje się na liście pól. Muszę znaleźć sposób na konwersję "nan" na NoneType.Zastępowanie pandy lub Numpy Nan za pomocą None do użycia z MysqlDB

Wszelkie pomysły?

+0

Nie ma ustawienia można zmienić w Pandy, aby powrócić do '' None' NULL' zamiast ' nan'? –

Odpowiedz

74

@bogatron ma rację, można użyć , warto zauważyć, że można to zrobić natywnie w pand:

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

Uwaga: zmienia to typ Dtype dla wszystkich kolumn na object.

Przykład:

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 

Uwaga: to, czego nie może zrobić przekształcenie DataFrames dtype aby zezwolić na wszystkie rodzaje typów danych, używając astype, a następnie metoda DataFrame fillna:

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

Niestety ani to, ani używanie replace, działa z, zobacz this (closed) issue.


Tak na marginesie, to warto zauważyć, że w większości przypadków użycia nie trzeba zastąpić NaN z None, patrz na to pytanie o the difference between NaN and None in pandas.

Jednak w tym konkretnym przypadku wydaje się, że tak (przynajmniej w chwili udzielenia tej odpowiedzi).

+0

cripes, przepraszam za to, bardzo dobry punkt. Być może mógłbyś zamiast tego użyć "NULL" lub "None" ... –

+1

zaktualizowano używając pandas własnymi 'where' (co dziwnie nie jest w dokumentach!) –

+0

zobacz dokumenty http://pandas.pydata.org/pandas-docs /stable/indexing.html#where-and-masking – Jeff

10

Można zastąpić nan z None w numpy tablicy:

>>> 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'> 
+0

Jedynym potencjalnym problemem jest zmiana 'dtype',' x.dtype' to 'dtype ('float64')', natomiast 'y.dtype' to' dtype ('object') '. – Jaime

2

Całkiem stara, ale natknąłem się na ten sam problem. Spróbuj zrobić tak:

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

Po potykając się, to pracował dla mnie:

df = df.astype(object).where(pd.notnull(df),None) 
Powiązane problemy