Ich habe eine recurring problem mit Speichern von großen Zahlen in Python zu CSV. Die Zahlen sind Millisekunden-Epochenzeitstempel, die ich nicht konvertieren oder abschneiden kann und die in diesem Format gespeichert werden müssen. Da die Spalten mit den Millisekunden-Zeitstempeln auch einige NaN-Werte enthalten, wirft Pandas diese automatisch auf float (siehe the documentation in den Gotchas unter "Unterstützung für ganzzahlige NA".Python pandas große schwimmt mit to_csv
Ich kann dieses Verhalten anscheinend nicht vermeiden, also meine Frage ist, Wie kann ich diese Zahlen als Integer-Wert speichern, wenn ich df.to_csv verwende, dh ohne Dezimalpunkt oder nachgestellte Nullen? Ich habe Spalten mit Zahlen unterschiedlicher Gleitkommazahl im selben Datenrahmen und möchte die Information dort nicht verlieren die float_format
Parameter in to_csv scheinen das gleiche Format für all Schwimmer Spalten in meinem Datenrahmen anzuwenden
Ein Beispiel:.
>>> df = pd.DataFrame({'a':[1.25, 2.54], 'b':[1424380449437, 1425510731187]})
>>> df['b'].dtype
Out[1]: dtype('int64')
>>> df.loc[2] = np.NaN
>>> df
Out[1]:
a b
0 1.25 1.424380e+12
1 2.54 1.425511e+12
2 NaN NaN
>>> df['b'].dtype
dtype('float64')
>>> df.to_csv('test.csv')
>>> with open ('test.csv') as f:
... for line in f:
... print(line)
,a,b
0,1.25,1.42438044944e+12
1,2.54,1.42551073119e+12
2,,
Wie Sie sehen können, habe ich die Genauigkeit der letzten beiden Ziffern meines Zeitstempels verloren.
Sie könnten die 'nan' Werte möglicherweise durch Null ersetzen und dann die Spalte in intergers umwandeln. 'df.b = df.b.fillna (0) .astype (int)' oder '-1' verwenden, um die Einträge in der späteren Verarbeitung zu identifizieren. –
Das ist eine Möglichkeit, aber ein ziemlich klobiger Workaround. Ich würde es vorziehen, die "Nan" -Werte als solche zu behalten, da sie eine einfache Indizierung und Filterung ermöglicht. Außerdem kann jeder Platzhalterwert, den ich für das "nan" verwende, im Dataframe natürlich auftreten. – Alarik