python dataframe pandas drop column mit int

152

Ich verstehe, dass Sie zum Löschen einer Spalte df.drop verwenden ('Spaltenname', Achse = 1). Gibt es eine Möglichkeit, eine Spalte mithilfe eines numerischen Index anstelle des Spaltennamens zu löschen?

user1802143
quelle
Ich denke,
John

Antworten:

167

Sie können die Spalte im iIndex folgendermaßen löschen :

df.drop(df.columns[i], axis=1)

Es könnte seltsam funktionieren, wenn Sie doppelte Namen in Spalten haben. Um dies zu tun, können Sie die Spalte, die Sie löschen möchten, durch einen neuen Namen umbenennen. Oder Sie können DataFrame folgendermaßen neu zuweisen:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]
Roman Pekar
quelle
4
Ich denke, Sie haben den Punkt verpasst - sie wollen nach Index und nicht nach Label fallen. Das Konvertieren eines Index in ein Label wird nur nach Label gelöscht :(
Darren
So indizieren Sie Spalten, wenn ich 100 Spalten löschen muss, die in der Mitte des
Datenrahmens
108

Löschen Sie mehrere Spalten wie folgt:

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=Truewird verwendet, um die Änderungen im Datenrahmen selbst vorzunehmen, ohne dass die Spalte auf einer Kopie des Datenrahmens abgelegt wird. Wenn Sie Ihr Original intakt halten müssen, verwenden Sie:

df_after_dropping = df.drop(df.columns[cols],axis=1)
Myon
quelle
3
Wofür ist ein Inplace-Argument?
Sidpat
12
Wenn Sie nicht verwenden inplace=True, müssen df = df.drop()Sie tun, wenn Sie die Änderung an dfsich sehen möchten .
Myon
So indizieren Sie Spalten, wenn ich 100 Spalten löschen muss, die in der Mitte des Datenrahmens fortlaufend sind.
Sai Kiran
36

Wenn es mehrere Spalten mit identischen Namen gibt, werden mit den hier angegebenen Lösungen alle Spalten entfernt, nach denen möglicherweise nicht gesucht wird. Dies kann der Fall sein, wenn versucht wird, doppelte Spalten mit Ausnahme einer Instanz zu entfernen. Das folgende Beispiel verdeutlicht diese Situation:

# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y']) 


df
Out[495]: 
   x  x   y
0  0  0   6
1  1  1   7
2  2  2   8
3  3  3   9
4  4  4  10

# attempting to drop the first column according to the solution offered so far     
df.drop(df.columns[0], axis = 1) 
   y
0  6
1  7
2  8
3  9
4  10

Wie Sie sehen können, wurden beide Xs-Spalten gelöscht. Alternative Lösung:

column_numbers = [x for x in range(df.shape[1])]  # list of columns' integer indices

column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column

   x  y
0  0  6
1  1  7
2  2  8
3  3  9
4  4  10

Wie Sie sehen können, wurde dadurch wirklich nur die 0. Spalte (erstes 'x') entfernt.

Saeed
quelle
1
Du bist mein Held. Ich habe viel zu lange versucht, mir einen klugen Weg zu überlegen, dies zu tun.
ATK7474
5

Sie müssen die Spalten anhand ihrer Position im Datenrahmen identifizieren. Wenn Sie beispielsweise die Spaltennummern 2,3 und 5 löschen (löschen) möchten, ist dies:

df.drop(df.columns[[2,3,5]], axis = 1)
Kripalu Sar
quelle
4

Wenn Sie zwei Spalten mit demselben Namen haben. Eine einfache Möglichkeit besteht darin, die Spalten manuell wie folgt umzubenennen:

df.columns = ['column1', 'column2', 'column3']

Dann können Sie wie gewünscht über den Spaltenindex löschen: -

df.drop(df.columns[1], axis=1, inplace=True)

df.column[1] wird Index 1 löschen.

Denken Sie daran, Achse 1 = Spalten und Achse 0 = Zeilen.

Nocken
quelle
3

Wenn Sie es wirklich mit ganzen Zahlen machen wollen (aber warum?), können Sie ein Wörterbuch erstellen.

col_dict = {x: col for x, col in enumerate(df.columns)}

dann df = df.drop(col_dict[0], 1)funktioniert wie gewünscht

Bearbeiten: Sie können es in eine Funktion einfügen, die dies für Sie erledigt. Auf diese Weise wird das Wörterbuch jedoch jedes Mal erstellt, wenn Sie es aufrufen

def drop_col_n(df, col_n_to_drop):
    col_dict = {x: col for x, col in enumerate(df.columns)}
    return df.drop(col_dict[col_n_to_drop], 1)

df = drop_col_n(df, 2)
mkln
quelle
1

Sie können die folgende Zeile verwenden, um die ersten beiden Spalten (oder jede Spalte, die Sie nicht benötigen) zu löschen:

df.drop([df.columns[0], df.columns[1]], axis=1)

Referenz

Mojtaba Peyrovi
quelle
-1

Da es mehrere Spalten mit demselben Namen geben kann, sollten wir zuerst die Spalten umbenennen. Hier ist Code für die Lösung.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
Donner
quelle