Wie wähle ich alle Spalten außer einer Spalte in Pandas aus?

277

Ich habe einen Datenrahmen, der so aussieht:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

Wie kann ich alle Spalten außer bekommen column b?

Markov Zain
quelle
@ cs95 - Das aktuell aufgelistete doppelte Ziel ist kein Duplikat. Trotz des Originaltitels lautet die verknüpfte Frage "Warum funktioniert diese spezielle Syntax nicht?", Während diese Frage allgemeiner ist: "Was ist der beste Weg, dies zu tun?". - Fügen Sie den Unterschied zwischen dem Löschen einer Spalte aus einem vorhandenen DataFrame und dem Erstellen eines neuen DataFrame mit allen Spalten einer anderen Spalte hinzu.
RM
@RM Es tut mir leid, aber ich bin nicht mit der Änderung einverstanden, die Sie am Titel dieses Beitrags vorgenommen haben, daher habe ich ihn zurückgesetzt. Es ist wahr, dass die Absicht des OP darin bestand, die Syntax in Frage zu stellen, aber der Beitrag ist gewachsen, um die umfassendere Frage zu beantworten, wie eine Spalte gelöscht werden kann. Die Antworten in diesem Beitrag sind Durchschläge des am höchsten bewerteten Beitrags dort. Der Betrüger bleibt.
CS95
Beachten Sie, dass diese Frage in Meta diskutiert wird .
Heretic Monkey

Antworten:

420

Wenn die Spalten kein MultiIndex sind, df.columnshandelt es sich nur um ein Array von Spaltennamen, sodass Sie Folgendes tun können:

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127
Marius
quelle
13
Nicht schlecht, aber @ mikes Lösung dropist IMO besser. Ein bisschen lesbarer und behandelt Multiindexes
travc
5
Ich stimme tatsächlich zu, dass die Verwendung von @ mike dropbesser ist - ich denke, es ist nützlich zu entdecken, dass (einstufige) Spalten Arrays sind, mit denen Sie arbeiten können, aber speziell zum Löschen einer Spalte, dropdie sehr gut lesbar sind und mit komplexen Indizes gut funktionieren.
Marius
1
Vielen Dank für diese großartige Antwort. Was ist, wenn ich keinen Header habe? Wie adressiere ich?
FabioSpaghetti
1
Was ist, wenn Sie mehr als eine Spalte haben, die ignoriert werden muss?
Bruno Ambrozio
227

Nicht benutzen ix. Es ist veraltet . Die lesbarste und idiomatischste Art, dies zu tun, ist df.drop():

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

Beachten Sie, dass standardmäßig .drop()nicht an Ort und Stelle funktioniert. ist trotz des ominösen Namens dfvon diesem Prozess unversehrt. Wenn Sie dauerhaft entfernen möchten baus df, tun df.drop('b', inplace=True).

df.drop()Akzeptiert auch eine Liste von Beschriftungen, z. B. df.drop(['a', 'b'], axis=1)wird die Spalte aund gelöscht b.

Mike
quelle
1
Funktioniert auch mit einem Multiindex, wie Sie es erwarten würden. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Scheint Liste gegen Tupel zu verwenden, um zu bestimmen, ob Sie mehrere Spalten (Liste) oder einen Multiindex (Tupel) möchten.
Travc
16
Lesbarer: df.drop(columns='a')oder df.drop(columns=['a', 'b']). Kann auch ersetzen columns=mit index=.
BallpointBen
Dies ist jedoch nicht hilfreich, wenn Sie nicht die Namen aller Spalten kennen, die Sie löschen möchten.
Yeliabsalohcin
Da hierdurch eine Kopie und keine Ansicht / Referenz erstellt wird, können Sie den ursprünglichen Datenrahmen nicht ändern, indem Sie dies auf der linken Seite einer Zuweisung verwenden.
Jan Christoph Terasa
132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833
Ayhan
quelle
9
Ich mag diesen Ansatz, da damit mehr als eine Spalte weggelassen werden kann.
Nischal Hp
3
@NischalHp df.drop kann auch mehr als eine Spalte df.drop weglassen (['a', 'b'], Achse = 1)
Patrick Li
2
Ich denke, es ist erwähnenswert, dass dies Ihre Säulen neu anordnen kann
ocean800
1
@ ocean800 Ja das stimmt. Sie können bestehen, sort=Falsewenn Sie dieses Verhalten vermeiden möchten ( df.columns.difference(['b'], sort=False))
Ayhan
64

Sie können verwenden df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

Wenn Sie mehrere Spalten löschen möchten, so einfach wie:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]
Tom
quelle
12

Hier ist ein anderer Weg:

df[[i for i in list(df.columns) if i != '<your column>']]

Sie übergeben nur alle Spalten, die angezeigt werden sollen, mit Ausnahme derjenigen, die Sie nicht möchten.

Salvador Dali
quelle
5

Eine weitere geringfügige Änderung an @Salvador Dali ermöglicht das Ausschließen einer Liste von Spalten:

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

oder

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
user1718097
quelle
4

Ich denke, der beste Weg ist der von @Salvador Dali erwähnte Weg. Nicht dass die anderen falsch liegen.

Denn wenn Sie einen Datensatz haben, in dem Sie nur eine Spalte auswählen und zu Vergleichs- oder Berechnungszwecken in eine Variable und den Rest der Spalten in eine andere einfügen möchten. Dann hilft es möglicherweise nicht, die Spalte des Datensatzes zu löschen. Natürlich gibt es auch dafür Anwendungsfälle.

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

Dann können Sie diese Sammlung von Spalten in Variablen x_colsin eine andere Variable einfügen, wie x_cols1für andere Berechnungen.

ex: x_cols1 = data[x_cols]
Sudhi
quelle
Können Sie erklären, warum dies eine separate Antwort anstelle eines Kommentars / einer Erweiterung von Salvadors Antwort ist?
3

Hier ist ein einzeiliges Lambda:

df[map(lambda x :x not in ['b'], list(df.columns))]

vorher :

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

nachher :

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
Grant Shannon
quelle