Gibt es eine bevorzugte Möglichkeit, den Datentyp eines numpy
Arrays als int
( int64
oder was auch immer) festzuhalten, während ein Element weiterhin als aufgeführt ist numpy.NaN
?
Insbesondere konvertiere ich eine interne Datenstruktur in einen Pandas DataFrame. In unserer Struktur haben wir Spalten vom Typ Integer, die noch NaNs haben (aber der d-Typ der Spalte ist int). Es scheint alles als Float neu zu formulieren, wenn wir dies zu einem DataFrame machen, aber wir würden es wirklich gerne sein int
.
Gedanken?
Dinge versucht:
Ich habe versucht, die from_records()
Funktion unter pandas.DataFrame mit zu verwenden, coerce_float=False
und das hat nicht geholfen. Ich habe auch versucht, NumPy-maskierte Arrays mit NaN fill_value zu verwenden, was ebenfalls nicht funktioniert hat. All dies führte dazu, dass der Spaltendatentyp zu einem Float wurde.
from_records
Funktion unter pandas.DataFrame mit ausprobiert,coerce_float=False
aber kein Glück ... die neuen Daten haben immer noch den Typfloat64
.Antworten:
Diese Funktion wurde Pandas hinzugefügt (beginnend mit Version 0.24): https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support
Zu diesem Zeitpunkt muss die Erweiterung dtype Int64 (großgeschrieben) anstelle des Standard-dtype int64 (Kleinbuchstaben) verwendet werden.
quelle
'Int64'
, damit es funktioniert. Es ist sogar noch besser, wenn es standardmäßig aktiviert ist.'Int64'
oder gibt es so etwas'Int8'
? Es verbraucht eine verrückte Menge an Speicher im Vergleich zunp.float
.'Int8'
scheint zu funktionieren,np.float
scheint aber immer noch viel schneller zu laden. Das Problem scheint zu sein, dass dazwischen kein Speicher freigegeben wird. Angenommen, der Garbage Collector wird irgendwann ausgeführt.NaN
kann nicht in einem Integer-Array gespeichert werden. Dies ist derzeit eine bekannte Einschränkung von Pandas. Ich habe darauf gewartet, dass Fortschritte bei den NA-Werten in NumPy erzielt werden (ähnlich wie bei den NAs in R), aber es wird mindestens 6 Monate bis ein Jahr dauern, bis NumPy diese Funktionen erhält.http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(Diese Funktion wurde ab Version 0.24 von pandas hinzugefügt. Beachten Sie jedoch, dass die Erweiterung dtype Int64 (großgeschrieben) anstelle des Standard-dtype int64 (Kleinbuchstaben) verwendet werden muss: https://pandas.pydata.org/pandas- docs / version / 0.24 / whatsnew / v0.24.0.html # optional-integer-na-support )
quelle
Wenn die Leistung nicht das Hauptproblem ist, können Sie stattdessen Zeichenfolgen speichern.
Dann können Sie dann mit
NaN
so viel mischen, wie Sie möchten. Wenn Sie wirklich Ganzzahlen haben möchten, können Sie abhängig von Ihrer Anwendung-1
oder0
, oder1234567890
oder einen anderen dedizierten Wert zur Darstellung verwendenNaN
.Sie können die Spalten auch vorübergehend duplizieren: eine wie Sie mit Floats; der andere experimentell, mit Ints oder Strings. Fügt dann
asserts
an jeder vernünftigen Stelle ein, um zu überprüfen, ob die beiden synchron sind. Nach genügend Tests können Sie die Schwimmer loslassen.quelle
Dies ist nicht für alle Fälle eine Lösung, aber für meine (Genomkoordinaten) habe ich 0 als NaN verwendet
Dies ermöglicht zumindest die Verwendung des richtigen "nativen" Spaltentyps. Operationen wie Subtraktion, Vergleich usw. funktionieren wie erwartet
quelle
Pandas v0.24 +
Funktionen zur Unterstützung
NaN
in Ganzzahlserien sind ab Version 0.24 verfügbar. Es gibt Informationen zu diesem Thema in den v0.24 Abschnitt „Was ist neu“, und weitere Details unter Nullable Integer - Datentyp .Pandas v0.23 und früher
Im Allgemeinen ist es am besten,
float
wenn möglich mit Serien zu arbeiten , auch wenn die Serie aufgrund der Einbeziehung von Werten vonint
bisfloat
nach oben übertragen wirdNaN
. Dies ermöglicht vektorisierte NumPy-basierte Berechnungen, bei denen andernfalls Python-Schleifen verarbeitet würden.In den Dokumenten wird Folgendes vorgeschlagen : "Eine Möglichkeit besteht darin,
dtype=object
stattdessen Arrays zu verwenden." Beispielsweise:Aus kosmetischen Gründen, z. B. Ausgabe in eine Datei, kann dies sein dies vorzuziehen sein.
Pandas v0.23 und früher: Hintergrund
NaN
gilt als afloat
. In den aktuellen Dokumenten (ab Version 0.23) wird der Grund angegeben, warum Ganzzahlserien auf Folgendes übertragen werdenfloat
:Die Dokumente enthalten auch Regeln für das Upcasting aufgrund der
NaN
Aufnahme:quelle
Dies ist jetzt möglich, da pandas v 0.24.0
Versionshinweise zu pandas 0.24.x Zitat: " Pandas hat die Fähigkeit erlangt, ganzzahlige d-Typen mit fehlenden Werten zu halten.
quelle
Ich wollte nur hinzufügen, dass für den Fall, dass Sie versuchen, einen float (1.143) -Vektor in eine Ganzzahl (1) zu konvertieren, bei der NA in den neuen 'Int64'-D-Typ konvertiert wird, eine Fehlermeldung angezeigt wird. Um dies zu lösen, müssen Sie die Zahlen runden und dann ".astype ('Int64')" ausführen.
Mein Anwendungsfall ist, dass ich eine Float-Reihe habe, die ich auf int runden möchte, aber wenn Sie .round () tun, bleibt ein '* .0' am Ende der Zahl übrig, sodass Sie diese 0 vom Ende bis zum Ende löschen können Konvertierung in int.
quelle
Wenn die Textdaten Leerzeichen enthalten, werden Spalten, die normalerweise Ganzzahlen sind, als float64-Typ in Floats umgewandelt, da der int64-Typ keine Nullen verarbeiten kann. Dies kann zu inkonsistenten Schemata führen, wenn Sie mehrere Dateien laden, von denen einige Leerzeichen enthalten (die als float64 und andere als int64 enden)
Dieser Code versucht, alle Spalten vom Typ Nummer in Int64 (im Gegensatz zu int64) zu konvertieren, da Int64 Nullen verarbeiten kann
quelle