Ich bin daran interessiert zu wissen, wie man einen Pandas-Datenrahmen in ein NumPy-Array konvertiert.
Datenrahmen:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
gibt
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Ich möchte dies wie folgt in ein NumPy-Array konvertieren:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
Wie kann ich das machen?
Ist es als Bonus möglich, die d-Typen so zu erhalten?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
o.ä?
Antworten:
Verwenden Sie diesen Code, um einen Pandas-Datenrahmen (df) in einen numpy ndarray zu konvertieren:
quelle
Verwerfen Sie Ihre Verwendung von
values
undas_matrix()
!In pandas v0.24.0 wurden zwei neue Methoden zum Abrufen von NumPy-Arrays aus Pandas-Objekten eingeführt:
to_numpy()
, die auf und Objekte definiertIndex
ist , undSeries,
DataFrame
array
, die nur fürIndex
undSeries
Objekte definiert ist .Wenn Sie die v0.24-Dokumente für besuchen
.values
, wird eine große rote Warnung angezeigt , die besagt:Weitere Informationen finden Sie in diesem Abschnitt der Versionshinweise zu Version 0.24.0 und in dieser Antwort .
Auf dem Weg zu einer besseren Konsistenz:
to_numpy()
Im Sinne einer besseren Konsistenz in der gesamten API wurde eine neue Methode
to_numpy
eingeführt, um das zugrunde liegende NumPy-Array aus DataFrames zu extrahieren.Wie oben erwähnt, ist diese Methode auch für
Index
undSeries
Objekte definiert (siehe hier ).Standardmäßig wird eine Ansicht zurückgegeben, sodass alle vorgenommenen Änderungen das Original beeinflussen.
Wenn Sie stattdessen eine Kopie benötigen, verwenden Sie
to_numpy(copy=True
).pandas> = 1.0 Update für ExtensionTypes
Wenn Sie pandas 1.x verwenden, werden Sie wahrscheinlich viel mehr mit Erweiterungstypen zu tun haben. Sie müssen etwas vorsichtiger sein, dass diese Erweiterungstypen korrekt konvertiert werden.
Dies wird in den Dokumenten erwähnt .
Wenn Sie die
dtypes
...Wie in einer anderen Antwort gezeigt,
DataFrame.to_records
ist dies ein guter Weg, dies zu tun.Dies ist
to_numpy
leider nicht möglich. Alternativ können Sie jedoch Folgendes verwendennp.rec.fromrecords
:In Bezug auf die Leistung ist es fast das gleiche (tatsächlich ist die Verwendung
rec.fromrecords
etwas schneller).Begründung für das Hinzufügen einer neuen Methode
to_numpy()
(zusätzlich zuarray
) wurde als Ergebnis von Diskussionen unter zwei GitHub-Ausgaben GH19954 und GH23623 hinzugefügt .In den Dokumenten wird insbesondere die Begründung erwähnt:
to_numpy
Ziel ist es, die Konsistenz der API zu verbessern, was ein wichtiger Schritt in die richtige Richtung ist..values
wird in der aktuellen Version nicht veraltet sein, aber ich gehe davon aus, dass dies irgendwann in der Zukunft passieren wird. Daher möchte ich die Benutzer dringend bitten, so bald wie möglich auf die neuere API zu migrieren.Kritik anderer Lösungen
DataFrame.values
hat inkonsistentes Verhalten, wie bereits erwähnt.DataFrame.get_values()
ist einfach ein Wrapper herumDataFrame.values
, also gilt alles, was oben gesagt wurde.DataFrame.as_matrix()
ist jetzt veraltet, NICHT verwenden!quelle
as_matrix
einer anderen Lösung zu wechseln , in diesem Fallto_numpy
ohne zu erklären, wie die Spaltenauswahlfunktion von wiederhergestellt werden kannas_matrix
! Ich bin mir sicher, dass es andere Möglichkeiten gibt, Spalten auszuwählen, aber esas_matrix
gab mindestens eine davon!df[[col1, col2']].to_numpy()
? Sie sind sich nicht sicher, warum Sie der Meinung sind, dass der Wunsch, eine aktualisierte Alternative zu einer veralteten Funktion zu bewerben, eine Ablehnung der Antwort rechtfertigt.Hinweis : Die
.as_matrix()
in dieser Antwort verwendete Methode ist veraltet. Pandas 0.23.4 warnt:Pandas hat etwas eingebaut ...
gibt
quelle
object
.to_numpy
stattdessen (nicht auch.values
). Mehr hier .Ich würde nur die Funktionen DataFrame.reset_index () und DataFrame.values verketten , um die Numpy-Darstellung des Datenrahmens einschließlich des Index zu erhalten:
Um die dtypes zu erhalten, müssten wir dieses ndarray mit view in ein strukturiertes Array umwandeln :
quelle
Sie können die
to_records
Methode verwenden, müssen aber ein wenig mit den dtypes herumspielen, wenn sie von Anfang an nicht das sind, was Sie wollen. In meinem Fall ist der Indextyp nach dem Kopieren Ihres DF aus einer Zeichenfolge eine Zeichenfolge (dargestellt durch einen d-object
Typ in Pandas):Das Konvertieren des Recarray-D-Typs funktioniert bei mir nicht, aber in Pandas kann man dies bereits tun:
Beachten Sie, dass Pandas den Namen des Index
ID
im exportierten Datensatzarray nicht richtig (auf ) setzt (ein Fehler?), Sodass wir von der Typkonvertierung profitieren, um dies ebenfalls zu korrigieren.Im Moment hat Pandas nur 8-Byte-Ganzzahlen
i8
und Floatsf8
(siehe diese Ausgabe ).quelle
np.array
Konstruktor.Es scheint, als würde
df.to_records()
es für Sie funktionieren. Die genaue Funktion, nach der Sie suchen, wurde angefordert undto_records
als Alternative angegeben.Ich habe dies lokal anhand Ihres Beispiels ausprobiert, und dieser Aufruf liefert etwas, das der gesuchten Ausgabe sehr ähnlich ist:
Beachten Sie, dass dies
recarray
eher ein als ein istarray
. Sie können das Ergebnis in ein reguläres numpy-Array verschieben, indem Sie dessen Konstruktor als aufrufennp.array(df.to_records())
.quelle
to_records()
über 5 Jahren erwähnt wurde?Versuche dies:
quelle
Hier ist mein Ansatz zum Erstellen eines Strukturarrays aus einem Pandas-DataFrame.
Erstellen Sie den Datenrahmen
Definieren Sie eine Funktion zum Erstellen eines Numpy-Struktur-Arrays (kein Datensatz-Array) aus einem Pandas-DataFrame.
Verwenden Sie
reset_index
diese Option , um einen neuen Datenrahmen zu erstellen, der den Index als Teil seiner Daten enthält. Konvertieren Sie diesen Datenrahmen in ein Strukturarray.BEARBEITEN: df_to_sarray wurde aktualisiert, um Fehler beim Aufrufen von .encode () mit Python 3 zu vermeiden. Vielen Dank an Joseph Garvin und halcyon für ihren Kommentar und ihre Lösung.
quelle
Zwei Möglichkeiten, den Datenrahmen in seine Numpy-Array-Darstellung zu konvertieren.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Doc: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
quelle
Ein einfacher Weg für Beispiel DataFrame:
VERWENDEN:
ERHALTEN:
quelle
Hatte gerade ein ähnliches Problem beim Exportieren vom Datenrahmen in die Arcgis-Tabelle und bin auf eine Lösung von usgs gestoßen ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Kurz gesagt, Ihr Problem hat eine ähnliche Lösung:
quelle
Ich habe die obigen Antworten durchgesehen. Die Methode " as_matrix () " funktioniert, ist aber jetzt veraltet. Für mich funktionierte " .to_numpy () ".
Dies gibt ein mehrdimensionales Array zurück. Ich bevorzuge diese Methode, wenn Sie Daten aus Excel-Tabellen lesen und auf Daten aus einem beliebigen Index zugreifen müssen. Hoffe das hilft :)
quelle
Nach Meteores Antwort fand ich den Code
funktioniert bei mir nicht Deshalb habe ich meinen Code hier eingefügt, damit andere sich mit diesem Problem befassen können.
quelle
Eine einfache Möglichkeit, Datenrahmen in Numpy-Arrays zu konvertieren:
Die Verwendung von to_numpy wird empfohlen, um die Konsistenz zu gewährleisten.
Referenz: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
quelle
Versuche dies:
Weitere Informationen unter: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Gültig für numpy 1.16.5 und pandas 0.25.2.
quelle