531 Stimmen

Auswählen/Ausschließen von Spalten in Pandas

Ich möchte Ansichten oder DataFrames aus einem vorhandenen DataFrame basierend auf Spaltenauswahlen erstellen.

Zum Beispiel möchte ich ein DataFrame df2 aus einem DataFrame df1 erstellen, das alle Spalten außer zwei davon enthält. Ich habe versucht, Folgendes zu tun, aber es hat nicht funktioniert:

import numpy as np
import pandas as pd

# Erstellen eines DataFrames mit den Spalten A, B, C und D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

# Versuchen, ein zweites DataFrame df2 aus df mit allen Spalten außer 'B' und D zu erstellen
my_cols = set(df.columns)
my_cols.remove('B').remove('D')

# Dies gibt einen Fehler zurück ("unhashable type: set")
df2 = df[my_cols]

Was mache ich falsch? Vielleicht allgemeiner gefragt, welche Mechanismen hat Pandas, um die Auswahl und Ausschluss beliebiger Spalten aus einem DataFrame zu unterstützen?

16voto

Kapil Marwaha Punkte 819

Sie haben 4 Spalten A, B, C, D

Hier ist eine bessere Möglichkeit, die Spalten auszuwählen, die Sie für das neue DataFrame benötigen:-

df2 = df1[['A','D']]

Wenn Sie stattdessen Spaltennummern verwenden möchten, verwenden Sie:-

df2 = df1[[0,3]]

10voto

tacaswell Punkte 79032

Sie müssen nur Ihr set in eine list umwandeln.

import pandas as pd
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
my_cols = set(df.columns)
my_cols.remove('B')
my_cols.remove('D')
my_cols = list(my_cols)
df2 = df[my_cols]

8voto

LondonRob Punkte 62228

So erstellen Sie eine Kopie eines DataFrames, wobei eine Liste von Spalten ausgeschlossen wird:

df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
df2 = df.drop(['B', 'D'], axis=1)

Aber Vorsicht! Sie erwähnen Ansichten in Ihrer Frage, was darauf hindeutet, dass Sie, wenn Sie df ändern, auch möchten, dass sich df2 ändert. (Wie dies bei einer Ansicht in einer Datenbank der Fall wäre.)

Dieses Verfahren erreicht dies nicht:

>>> df.loc[0, 'A'] = 999 # Ändern des ersten Werts in df
>>> df.head(1)
     A         B         C         D
0  999 -0.742688 -1.980673 -0.920133
>>> df2.head(1) # df2 bleibt unverändert. Es handelt sich nicht um eine Ansicht, sondern um eine Kopie!
          A         C
0  0.251262 -1.980673

Beachten Sie auch, dass dies auch für die Methode von @piggybox gilt. (Obwohl diese Methode schön und geschickt ist und Pythonisch. Ich möchte sie nicht schlecht machen!)

Weitere Informationen zu Ansichten vs. Kopien finden Sie unter dieser SO-Antwort und in diesem Teil der Pandas-Dokumentation, auf den sich diese Antwort bezieht.

8voto

pylang Punkte 33775

In ähnlicher Weise kann man beim Lesen einer Datei möglicherweise Spalten im Voraus ausschließen, anstatt unerwünschte Daten unnötigerweise in den Speicher einzulesen und später zu verwerfen.

Ab pandas 0.20.0 akzeptiert usecols jetzt Aufrufbare1. Dieses Update ermöglicht flexiblere Optionen zum Lesen von Spalten:

skipcols = [...]
read_csv(..., usecols=lambda x: x not in skipcols)

Das letztere Muster entspricht im Wesentlichen dem umgekehrten traditionellen usecols-Methode - nur angegebene Spalten werden übersprungen.


Gegeben

Daten in einer Datei

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

filename = "foo.csv"
df.to_csv(filename)

Code

skipcols = ["B", "D"]
df1 = pd.read_csv(filename, usecols=lambda x: x not in skipcols, index_col=0)
df1

Ausgabe

          A         C
0  0.062350  0.076924
1 -0.016872  1.091446
2  0.213050  1.646109
3 -1.196928  1.153497
4 -0.628839 -0.856529
...

Details

Ein DataFrame wurde in eine Datei geschrieben. Es wurde dann als separates DataFrame zurückgelesen und jetzt werden unerwünschte Spalten (B und D) übersprungen.

Zu beachten ist, dass für die Situation des OP, da die Daten bereits erstellt sind, der bessere Ansatz die akzeptierte Antwort ist, die unerwünschte Spalten aus einem bestehenden Objekt entfernt. Die hier vorgestellte Technik ist jedoch am nützlichsten, wenn Daten direkt aus Dateien in ein DataFrame gelesen werden.

Es wurde eine Anfrage für eine "skipcols"-Option in <a href="https://github.com/pandas-dev/pandas/issues/10882" rel="noreferrer">diesem Issue</a> gestellt und in einem späteren <a href="https://github.com/pandas-dev/pandas/issues/15799" rel="noreferrer">Issue</a> behandelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X