Auswählen/Ausschließen von Spaltensätzen in Pandas [duplicate]
Lesezeit: 1 Minute
Amelio Vázquez-Reina
Ich möchte Ansichten oder Datenrahmen aus einem vorhandenen Datenrahmen basierend auf der Spaltenauswahl erstellen.
Zum Beispiel möchte ich einen Datenrahmen erstellen df2 aus einem Datenrahmen df1 die alle Spalten enthält, außer zwei davon. Ich habe versucht, Folgendes zu tun, aber es hat nicht funktioniert:
import numpy as np
import pandas as pd
# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# Try to create a second dataframe df2 from df with all columns except 'B' and D
my_cols = set(df.columns)
my_cols.remove('B').remove('D')
# This returns an error ("unhashable type: set")
df2 = df[my_cols]
Was mache ich falsch? Vielleicht allgemeiner, welche Mechanismen haben Pandas, um das Pflücken zu unterstützen und Ausschlüsse von beliebigen Sätzen von Spalten aus einem Datenrahmen?
Amrita Sawant
Sie können entweder die nicht benötigten Spalten löschen ODER die benötigten auswählen
# Using DataFrame.drop
df.drop(df.columns[[1, 2]], axis=1, inplace=True)
# drop by Name
df1 = df1.drop(['B', 'C'], axis=1)
# Select the ones you want
df1 = df[['a','d']]
Gibt es eine Möglichkeit, nur die auszuwählen nSpalte? dh: df1 = my_df[[n]] wo n ist die letzte Spalte von n Anzahl der Spalten, versuche ich negative Indizierung [[-1]]<- es funktioniert nicht :( Hilfe!~
– 3kstc
8. März 2018 um 3:26 Uhr
@3kstc können Sie verwenden df1.iloc[:, [-1]] Dadurch werden alle Zeilen und die letzte Spalte ausgewählt.
– Kocur4d
25. April 2018 um 10:16 Uhr
was ist mit verwenden isin für Spalten? Keine Notwendigkeit zu fallen oder zu schleifen. Siehe meine Antwort unten.
– HerrE
30. Juli 2018 um 20:43 Uhr
Sie können auch tippen df.drop(columns=['B', 'C'])
– Levi Baguley
23. August 2021 um 21:13 Uhr
IanS
Es gibt eine neue aufgerufene Indexmethode difference. Es gibt die ursprünglichen Spalten zurück, wobei die als Argument übergebenen Spalten entfernt wurden.
Hier wird das Ergebnis verwendet, um Spalten zu entfernen B und D aus df:
df2 = df[df.columns.difference(['B', 'D'])]
Beachten Sie, dass es sich um eine satzbasierte Methode handelt, sodass doppelte Spaltennamen Probleme verursachen und die Spaltenreihenfolge möglicherweise geändert wird.
Vorteil Über drop: Sie erstellen keine Kopie des gesamten Datenrahmens, wenn Sie nur die Liste der Spalten benötigen. Um beispielsweise Duplikate in einer Teilmenge von Spalten zu löschen:
# may create a copy of the dataframe
subset = df.drop(['B', 'D'], axis=1).columns
# does not create a copy the dataframe
subset = df.columns.difference(['B', 'D'])
df = df.drop_duplicates(subset=subset)
Nett. Gibt es einen Vorteil/Nachteil, es auf diese Weise zu tun gegenüber df.drop(['B', 'D'], axis=1)?
– Ben
29. September 2016 um 21:23 Uhr
Der Vorteil ist für mich die Lesbarkeit des Codes. Ich finde die Verwendung von drop zur Auswahl von Spalten kontraintuitiv.
– Ians
30. September 2016 um 8:30 Uhr
difference() scheint auch Spalten standardmäßig alphabetisch neu zu ordnen
– slizb
1. Dezember 2016 um 22:16 Uhr
@slizb guter Punkt, basierend auf dem Quellcode Es sieht so aus, als gäbe es tatsächlich keine Garantie für die Reihenfolge des zurückgegebenen Indexes, da die Methode Sets verwendet.
– Ians
2. Dezember 2016 um 8:46 Uhr
Es scheint, dass die Drop-Methode etwas schneller ist (~ 515 µs gegenüber ~ 680 µs), zumindest in einigen Tests auf einem Datenrahmen mit 15611 Zeilen x 5 Spalten, von dem ich 3 Spalten löschen wollte, in Python 3.6 und Pandas 0.20.3.
– bli
8. November 2017 um 17:12 Uhr
HerrE
Eine weitere Option, ohne in einer Schleife zu löschen oder zu filtern:
import numpy as np
import pandas as pd
# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# include the columns you want
df[df.columns[df.columns.isin(['A', 'B'])]]
# or more simply include columns:
df[['A', 'B']]
# exclude columns you don't want
df[df.columns[~df.columns.isin(['C','D'])]]
# or even simpler since 0.24
# with the caveat that it reorders columns alphabetically
df[df.columns.difference(['C', 'D'])]
Nett. Ausfall von list(df.columns).remove('C') hat mich wahnsinnig gemacht.
– PatrickT
7. Januar um 20:17 Uhr
Sie müssen das nicht wirklich in ein Set umwandeln:
cols = [col for col in df.columns if col not in ['B', 'D']]
df2 = df[cols]
Vielen Dank! Das funktioniert einwandfrei. Ich frage mich nur, ob es Funktionen in Panda gibt, die die Spezifikation von Spalten für diese Art (oder ausgefeiltere Arten) der Spaltenfilterung erleichtern?
– Amelio Vázquez-Reina
18. Februar 2013 um 17:17 Uhr
@ user273158 Weiß nicht, ich fange gerade erst an zu lernen Pandas mich selbst.
– tacaswell
18. Februar 2013 um 17:20 Uhr
Vielleicht verwenden fallen?. df.drop(my_cols, axis=1) erzeugt eine Ansicht des DataFrame mit den gelöschten Spalten. Sie müssen es dann nur noch dem neuen DF zuweisen: df2 = df.drop(my_cols, axis=1)