Próbuję napisać Dataframe Pandas (lub można użyć tablicy numpy) do bazy danych mysql przy użyciu MysqlDB. Wydaje się, że MysqlDB nie rozumie „nan”, a moja baza danych wyświetla błąd informujący, że nan nie ma na liście pól. Muszę znaleźć sposób na przekonwertowanie „nan” na NoneType.
Jakieś pomysły?
python
pandas
numpy
mysql-python
Rishi
źródło
źródło
None
doNULL
zamiastnan
?Odpowiedzi:
@bogatron ma rację, możesz użyć
where
, warto zauważyć, że możesz to zrobić natywnie w pandach:Uwaga: spowoduje to zmianę typu dtype wszystkich kolumn na
object
.Przykład:
Uwaga: czego nie można zrobić przekształcenia DataFrames,
dtype
aby zezwolić na wszystkie typy danych, używającastype
, a następniefillna
metody DataFrame :Niestety ani to, ani przy użyciu
replace
, współpracuje zNone
zobaczyć tę kwestię (zamknięte) .Na marginesie, warto zauważyć, że w większości przypadków użycia nie trzeba zastępować NaN na None, zobacz to pytanie o różnicę między NaN i None w pandach .
Jednak w tym konkretnym przypadku wydaje się, że tak (przynajmniej w momencie tej odpowiedzi).
źródło
np.nan
konwersji na ciąg"nan"
dtype
odobject
i robią to dla tych, którzy zajmują się inne rodzaje i różnie w zależności od potrzeb. Idealniefillna(None)
byłoby wspaniale.Podziękowania dla tego gościa w tej kwestii na Githubie .
źródło
df.replace({np.nan: None})
jako obiektu tymczasowegoMożna wymienić
nan
zeNone
w numpy tablicy:źródło
dtype
,x.dtype
jestdtype('float64')
, podczas gdyy.dtype
jestdtype('object')
.Po potknięciu się, to zadziałało dla mnie:
źródło
To tylko dodatek do odpowiedzi @Andy Hayden:
Ponieważ
DataFrame.mask
jest przeciwieństwemDataFrame.where
, mają dokładnie ten sam podpis, ale o przeciwnym znaczeniu:DataFrame.where
jest przydatny do zastępowania wartości, w których warunek jest fałszywy .DataFrame.mask
służy do zastępowania wartości, w których warunek to True .Więc w tym pytaniu używanie
df.mask(df.isna(), other=None, inplace=True)
może być bardziej intuicyjne.źródło
Kolejny dodatek: zachowaj ostrożność podczas zastępowania wielokrotności i konwertowania typu kolumny z powrotem z obiektu na zmiennoprzecinkowy . Jeśli chcesz mieć pewność, że
None
nie wrócisz do tegonp.NaN
, zastosuj sugestię @ andy-hayden dotyczącą używaniapd.where
. Ilustracja pokazująca, jak wymiana nadal może pójść „źle”:źródło
.replace({np.nan: None})
replace({np.nan: None})
. Mój komentarz został dodany, aby zwrócić uwagę na potencjalną pułapkę podczas wymianynp.nan
. Powyższe z pewnością trochę mnie zaskoczyło!Dość stary, ale natknąłem się na ten sam problem. Spróbuj to zrobić:
źródło