Ich versuche, einen Pandas-Datenrahmen (oder kann ein Numpy-Array verwenden) mit MysqlDB in eine MySQL-Datenbank zu schreiben. MysqlDB scheint 'nan' nicht zu verstehen und meine Datenbank gibt einen Fehler aus, der besagt, dass nan nicht in der Feldliste enthalten ist. Ich muss einen Weg finden, das 'nan' in einen NoneType umzuwandeln.
Irgendwelche Ideen?
python
pandas
numpy
mysql-python
Rishi
quelle
quelle
None
fürNULL
stattnan
?Antworten:
@bogatron hat es richtig, Sie können verwenden
where
, es ist erwähnenswert, dass Sie dies nativ in Pandas tun können:Hinweis: Dadurch wird der dtype aller Spalten in geändert
object
.Beispiel:
Hinweis: Was Sie nicht tun können, ist eine Neufassung der DataFrames
dtype
, um alle Datentypen zuzulassenastype
, und anschließend die DataFrame-fillna
Methode:Leider weder diese, noch mit
replace
, arbeitet mitNone
sehen diese (geschlossen) Problem .Abgesehen davon ist es erwähnenswert, dass Sie in den meisten Anwendungsfällen NaN nicht durch None ersetzen müssen. Lesen Sie diese Frage zum Unterschied zwischen NaN und None bei Pandas .
In diesem speziellen Fall scheint dies jedoch der Fall zu sein (zumindest zum Zeitpunkt dieser Antwort).
quelle
np.nan
Konvertierung in String"nan"
dtype
vonobject
und tun es für diese und andere Arten unterschiedlich behandeln je nach Bedarf. Im Idealfallfillna(None)
wäre super.Dank geht an diesen Kerl hier in dieser Github-Ausgabe .
quelle
df.replace({np.nan: None})
als temporäres Objekt verwenden könnenSie können ersetzen
nan
mitNone
in Ihrer numpy Array:quelle
dtype
,x.dtype
istdtype('float64')
, währendy.dtype
istdtype('object')
.Nachdem ich herumgestolpert war, funktionierte das für mich:
quelle
Nur eine Ergänzung zu @Andy Haydens Antwort:
Da
DataFrame.mask
es sich um den entgegengesetzten Zwilling handeltDataFrame.where
, haben sie genau die gleiche Signatur, jedoch mit entgegengesetzter Bedeutung:DataFrame.where
ist nützlich, um Werte zu ersetzen, bei denen die Bedingung False ist .DataFrame.mask
wird zum Ersetzen von Werten verwendet, bei denen die Bedingung True ist .In dieser Frage ist die Verwendung
df.mask(df.isna(), other=None, inplace=True)
möglicherweise intuitiver.quelle
Ein weiterer Zusatz: Seien Sie vorsichtig, wenn Sie Vielfache ersetzen und den Spaltentyp vom Objekt zum Float zurückkonvertieren . Wenn Sie sicher sein möchten, dass Ihre
None
nicht zunp.NaN
den Vorschlägen von @ andy-hayden zurückkehrenpd.where
. Illustration, wie das Ersetzen immer noch "schief" gehen kann:quelle
.replace({np.nan: None})
replace({np.nan: None})
. Mein Kommentar wurde hinzugefügt, um auf die mögliche Gefahr beim Ersetzen hinzuweisennp.nan
. Das obige hat mich sicherlich ein bisschen gestolpert!Ziemlich alt, aber ich bin auf das gleiche Problem gestoßen. Versuchen Sie Folgendes:
quelle