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?


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]]

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)

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.


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)

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.


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)

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


-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.