Wie konvertiere ich eine Pandas-Serie oder einen Pandas-Index in ein Numpy-Array?

264

Wissen Sie, wie Sie den Index oder die Spalte eines DataFrame als NumPy-Array oder Python-Liste abrufen können?

ericmjl
quelle
1
HINWEIS: Wenn Sie Pandas DataFrame in ein Array (oder eine Liste) wie dieses konvertieren müssen, kann dies auf andere Probleme hinweisen. Ich empfehle dringend sicherzustellen, dass ein DataFrame die geeignete Datenstruktur für Ihren speziellen Anwendungsfall ist und dass Pandas keine Möglichkeit zur Ausführung der Operationen enthält, an denen Sie interessiert sind.
AMC

Antworten:

353

Um ein NumPy-Array zu erhalten, sollten Sie das folgende valuesAttribut verwenden:

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

Dadurch wird darauf zugegriffen, wie die Daten bereits gespeichert sind, sodass keine Konvertierung erforderlich ist.
Hinweis: Dieses Attribut ist auch für viele andere Pandas-Objekte verfügbar.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Um den Index als Liste abzurufen, rufen Sie auf tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

Und ähnlich für Spalten.

Andy Hayden
quelle
Hinweis: .valuesist veraltet, .to_numpy()ist der vorgeschlagene Ersatz, wenn Sie ein NumPy-Array möchten. Können Sie erweitern auf Dies greift darauf zu, wie die Daten bereits gespeichert sind, sodass keine Konvertierung erforderlich ist .
AMC
Die Antwort von cs95 gibt eine gute Erklärung für .values, .to_numpy()und .array.
AMC
75

Sie können verwenden, df.indexum auf das Indexobjekt zuzugreifen und dann die Werte in einer Liste mit abzurufen df.index.tolist(). Ebenso können Sie df['col'].tolist()für Serien verwenden.

bdiamante
quelle
Es gibt instanceMethod und kein Listenarray zurück
V Shreyas
12
@VShreyas, wie wäre esdf.index.values.tolist()
LancelotHolmes
3
df.index.tolist()gibt keine Instanzmethode zurück. Es wird eine Liste von Indizes zurückgegeben. Es ist eine Methode, die im Pandas-Index definiert ist. Während das erstmalige Aufrufen von Werten möglich ist, ist das Delegieren des Jobs an numpy keine Korrektur, sondern nur eine Alternative.
Ayhan
49

Pandas> = 0,24

Verwerfen Sie Ihre Verwendung .valueszugunsten dieser Methoden!

Von v0.24.0 an werden wir zwei neue, bevorzugte Verfahren Prügel Marke haben für den Erhalt NumPy Arrays aus Index, Seriesund DataFrameObjekte: sie sind to_numpy(), und .array. In Bezug auf die Verwendung erwähnen die Dokumente:

Wir haben nicht entfernt oder veraltet Series.valuesoder DataFrame.values, aber wir empfehlen und verwenden .arrayoder .to_numpy()stattdessen.

Weitere Informationen finden Sie in diesem Abschnitt der Versionshinweise zu Version 0.24.0 .


to_numpy() Methode

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Standardmäßig wird eine Ansicht zurückgegeben. Alle vorgenommenen Änderungen wirken sich auf das Original aus.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Wenn Sie stattdessen eine Kopie benötigen, verwenden Sie to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Beachten Sie, dass diese Funktion auch für DataFrames funktioniert (während .arraydies nicht der Fall ist).


arrayAttribut
Dieses Attribut gibt einExtensionArrayObjekt zurück, das den Index / die Serie unterstützt.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

Von hier aus ist es möglich, eine Liste zu erhalten, indem Sie list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

oder rufen Sie einfach direkt an .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

In Bezug auf das, was zurückgegeben wird, erwähnen die Dokumente:

Für Seriesund Indexes, die von normalen NumPy-Arrays unterstützt werden, Series.array wird ein neuer zurückgegeben arrays.PandasArray, bei dem es sich um einen dünnen Wrapper (ohne Kopie) um a handelt numpy.ndarray. arrays.PandasArrayist für sich genommen nicht besonders nützlich, bietet jedoch dieselbe Schnittstelle wie jedes Erweiterungsarray, das in Pandas oder von einer Bibliothek eines Drittanbieters definiert ist.

Zusammenfassend .arraywird also entweder zurückkehren

  1. Die vorhandene ExtensionArrayUnterstützung des Index / der Serie oder
  2. Wenn ein NumPy-Array die Serie unterstützt, wird ein neues ExtensionArrayObjekt als Thin Wrapper über dem zugrunde liegenden Array erstellt.

Begründung für das Hinzufügen von ZWEI neuen Methoden
Diese Funktionen wurden als Ergebnis von Diskussionen unter zwei GitHub-Problemen GH19954 und GH23623 hinzugefügt .

In den Dokumenten wird insbesondere die Begründung erwähnt:

[...] .valuesdabei war unklar, ob der zurückgegebene Wert das tatsächliche Array, eine Transformation davon oder eines der benutzerdefinierten Pandas-Arrays (wie Categorical) sein würde. Zum Beispiel mit PeriodIndex, .values erzeugt eine neue ndarrayPerioden Objekte jedes Mal. [...]

Diese beiden Funktionen zielen darauf ab, die Konsistenz der API zu verbessern, was ein wichtiger Schritt in die richtige Richtung ist.

Schließlich .valueswird es 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.

cs95
quelle
48

Wenn Sie mit einem Multi-Index-Datenrahmen arbeiten, möchten Sie möglicherweise nur die Spalte eines Namens des Multi-Index extrahieren. Sie können dies als tun

df.index.get_level_values('name_sub_index')

und name_sub_indexmuss natürlich ein element der seinFrozenList df.index.names

gg349
quelle
16

Seit pandas v0.13 können Sie auch verwenden get_values:

df.index.get_values()
Yemu
quelle
5
Gibt es einen Unterschied zwischen diesem und .Werten? (Ich habe die Versionsinformationen aktualisiert, da diese Funktion aus den 0.13.0-Dokumenten hervorgeht.)
Andy Hayden
@Andy Hayden: Ist es nicht ein Unterschied, dass .get_values ​​der offizielle Weg ist, nur die aktuellen Werte abzurufen, während .values ​​(z. B. in einem Multi-Index) Indexwerte zurückgeben kann, für die die Zeilen oder Spalten gelöscht wurden?
Ezekiel Kruglick
@EzekielKruglick also ist es immer eine Kopie? Die mit der Dokumentation verknüpfte Dokumentation ist sehr leicht. Ich hätte nicht gedacht, dass Sie solche Dupes bekommen (selbst wenn sie im MI sind, werden sie nicht in den .Werten sein). Es wäre großartig, ein Beispiel zu sehen, das dies demonstriert!
Andy Hayden
@AndyHayden: Ich glaube, ich habe deinen Kommentar falsch gelesen. Sie haben Recht, .values ​​ist gut, .level gibt veraltete und get_values ​​gibt Ihnen die aktuellen Werte ohne ausgelassene Zeilen / Spalten. Ursprüngliches Github-Problem: github.com/pydata/pandas/issues/3686 Aber ich habe es gerade überprüft und es sieht so aus, als ob .values ​​(natürlich!) Aktuelle Informationen nur in einer anderen Form liefert, als ich dachte, worüber wir gesprochen haben
Ezekiel Kruglick
1
@AndyHayden Nein, es gibt keinen Unterschied. get_valuesruft einfach an .values. Es müssen mehr Zeichen eingegeben werden.
CS95
0

Ich konvertierte die Pandas dataframezu listund benutzte dann das Basic list.index(). Etwas wie das:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Sie haben Ihren Indexwert als idx.

Sarvagya Gupta
quelle
und dann die Basisliste verwendet.index () Wie hängt das mit der Frage zusammen, ob eine Serie in eine Liste konvertiert werden soll?
AMC
0

Eine neuere Möglichkeit hierfür ist die Verwendung der Funktion .to_numpy ().

Wenn ich einen Datenrahmen mit der Spalte 'Preis' habe, kann ich ihn wie folgt konvertieren:

priceArray = df['price'].to_numpy()

Sie können auch den Datentyp wie float oder object als Argument der Funktion übergeben

Jon R.
quelle
-1

Im Folgenden finden Sie eine einfache Möglichkeit, die Datenrahmenspalte in ein Numpy-Array zu konvertieren.

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy ist ein Numpy-Array.

Ich habe es mit versucht, to.numpy()aber es gab mir den folgenden Fehler: TypeError: Keine unterstützte Konvertierung für Typen: (dtype ('O'),) während der Klassifizierung der binären Relevanz mit linearem SVC. to.numpy () konvertierte den dataFrame in ein numpy-Array, aber der Datentyp des inneren Elements war list, weshalb der obige Fehler beobachtet wurde.

Kumar Shubham
quelle
Ich habe es mit to.numpy () versucht, aber es gab mir den folgenden Fehler: TypeError: Keine unterstützte Konvertierung für Typen: (dtype ('O'),) während der Klassifizierung der binären Relevanz mit linearem SVC. to.numpy () konvertierte den dataFrame in ein numpy-Array, aber der Datentyp des inneren Elements war list, weshalb der obige Fehler beobachtet wurde. Das ist aber nicht wirklich die Schuld von to_numpy.
AMC