Wie wählt man alle Spalten außer einer Spalte in Pandas aus?
Lesezeit: 4 Minuten
markov zain
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 bekomme ich alle Spalten außer column b?
@cs95 — Das derzeit aufgeführte doppelte Ziel ist kein Duplikat. Trotz des ursprünglichen Titels lautet die verlinkte Frage “Warum funktioniert diese spezifische Syntax nicht”, während diese Frage eine allgemeinere “Wie geht das am besten?” — Hinzu kommt der Unterschied zwischen dem Löschen einer Spalte aus einem vorhandenen DataFrame und dem Erstellen eines neuen DataFrame mit allen bis auf eine der Spalten eines anderen.
– RM
21. Mai ’19 um 19:30
@RM Es tut mir leid, aber ich stimme der Bearbeitung des Titels in diesem Beitrag nicht zu, daher habe ich ihn zurückgesetzt. Es stimmt, dass die Absicht des OP darin bestand, die Syntax in Frage zu stellen, aber der Beitrag ist gewachsen, um die allgemeinere Frage zum Löschen einer Spalte zu beantworten. Die Antworten in diesem Beitrag sind Kopien des dort am höchsten bewerteten Beitrags. Der Duplikat bleibt.
– cs95
21. Mai ’19 um 19:46
Beachten Sie, dass diese Frage auf Meta diskutiert wird.
– Ketzeraffe
21. Mai ’19 um 21:24
Marius
Wenn die Spalten kein MultiIndex sind, df.columns ist nur ein Array von Spaltennamen, damit 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
Nicht schlecht, aber @mikes Lösung mit drop ist IMO besser. Etwas besser lesbar und handhabt Multiindizes
– travc
30. Juni ’17 um 0:24
Ich stimme tatsächlich zu, dass @mikes Lösung mit drop ist besser – 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. drop ist sehr gut lesbar und funktioniert gut mit komplexen Indizes.
– Marius
23. April ’19 um 23:06
Vielen Dank für diese tolle Antwort. Was ist, wenn ich keinen Header habe? wie spreche ich an?
– FabioSpaghetti
17. September ’19 um 14:03
Was ist, wenn Sie mehr als 1 Spalte ignorieren müssen?
– Bruno Ambrozio
26. März ’20 um 9:06
@Marius Funktioniert das mit mehreren Spalten (sagen wir zwei)?
– MasayoMusic
23. Juni ’20 um 22:58
Mike
Nicht verwenden 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() funktioniert nicht an Ort und Stelle; Trotz des unheilvollen Namens, df bleibt bei diesem Vorgang unversehrt. Wenn Sie dauerhaft entfernen möchten b von df, tun df.drop('b', inplace=True).
df.drop() akzeptiert auch eine Liste von Labels, zB df.drop(['a', 'b'], axis=1) wird Spalte fallen lassen a und b.
Funktioniert auch auf einem Multiindex, wie Sie es erwarten würden. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Scheint Liste vs. Tupel zu verwenden, um zu bestimmen, ob Sie mehrere Spalten (Liste) oder auf einen Multiindex (Tupel) verweisen möchten.
– travc
30. Juni ’17 um 0:20
Besser lesbar: df.drop(columns='a') oder df.drop(columns=['a', 'b']). Kann auch ersetzen columns= mit index=.
– KugelschreiberBen
9. Mai ’18 um 13:52
Dies ist jedoch nicht nützlich, wenn Sie passieren nicht um die Namen aller Spalten zu kennen, die Sie löschen möchten.
– yeliabsalohcin
4. September ’18 um 16:17
Da dies eine Kopie und keine Ansicht/Referenz erstellt, können Sie den ursprünglichen Datenrahmen nicht ändern, indem Sie ihn auf der linken Seite einer Zuordnung verwenden.
– Jan Christoph Terasa
15. Apr. ’20 um 18:58
@JanChristophTerasa Wissen Sie zufällig, wie Sie diese ausgewählten Spalten innerhalb des ursprünglichen df ändern können (z. B. alle diese Spalten mit Werten einer anderen Spalte multiplizieren). Wenn ich diese Werte ändere, müsste ich die gelöschte Spalte am Ende anheften, was nicht der beste Weg zu sein scheint.
– MasayoMusic
23. Juni ’20 um 22:48
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
Ich mag diesen Ansatz, da er verwendet werden kann, um mehr als eine Spalte wegzulassen.
– Nischal Hp
30. August ’17 um 9:42
@NischalHp df.drop kann auch mehr als eine Spalte weglassen df.drop([‘a’, ‘b’], Achse=1)
– JACKY Li
25. Apr. ’19 um 13:02
Ich denke, es ist erwähnenswert, dass dies Ihre Spalten neu anordnen kann
– Ozean800
18. November ’19 um 6:33
@ocean800 Ja, das stimmt. Du kannst passieren sort=False wenn Sie dieses Verhalten vermeiden möchten (df.columns.difference(['b'], sort=False))
– ayhan
18. November ’19 um 6:44
Sie können verwenden df.columns.isin()
df.loc[:, ~df.columns.isin(['b'])]
Wenn Sie mehrere Spalten löschen möchten, gehen Sie wie folgt vor:
@cs95 — Das derzeit aufgeführte doppelte Ziel ist kein Duplikat. Trotz des ursprünglichen Titels lautet die verlinkte Frage “Warum funktioniert diese spezifische Syntax nicht”, während diese Frage eine allgemeinere “Wie geht das am besten?” — Hinzu kommt der Unterschied zwischen dem Löschen einer Spalte aus einem vorhandenen DataFrame und dem Erstellen eines neuen DataFrame mit allen bis auf eine der Spalten eines anderen.
– RM
21. Mai ’19 um 19:30
@RM Es tut mir leid, aber ich stimme der Bearbeitung des Titels in diesem Beitrag nicht zu, daher habe ich ihn zurückgesetzt. Es stimmt, dass die Absicht des OP darin bestand, die Syntax in Frage zu stellen, aber der Beitrag ist gewachsen, um die allgemeinere Frage zum Löschen einer Spalte zu beantworten. Die Antworten in diesem Beitrag sind Kopien des dort am höchsten bewerteten Beitrags. Der Duplikat bleibt.
– cs95
21. Mai ’19 um 19:46
Beachten Sie, dass diese Frage auf Meta diskutiert wird.
– Ketzeraffe
21. Mai ’19 um 21:24