Jak wybrać wszystkie kolumny, z wyjątkiem jednej kolumny w pandach?

278

Mam ramkę danych wyglądającą tak:

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

Jak mogę uzyskać wszystkie kolumny oprócz column b?

markov zain
źródło
@ cs95 - Aktualnie wymieniony zduplikowany cel nie jest duplikatem. Pomimo oryginalnego tytułu powiązane pytanie brzmi „Dlaczego ta konkretna składnia nie działa”, podczas gdy pytanie to jest bardziej ogólne „Jaki jest najlepszy sposób na to”. - Dodaj do tego różnicę między usuwaniem kolumny z istniejącej DataFrame a tworzeniem nowej DataFrame z kolumnami innej niż jedna.
RM
@RM Przykro mi, ale nie zgadzam się z dokonaną przez Ciebie zmianą tytułu w tym poście, więc wycofałem go. To prawda, że ​​celem PO było zakwestionowanie składni, ale post rozwinął się, by odpowiedzieć na szersze pytanie, jak usunąć kolumnę. Odpowiedzi w tym poście są kopiami najwyżej ocenionego postu tam. Dupe zostaje.
cs95,
Uwaga: to pytanie jest omawiane na Meta .
Heretic Monkey

Odpowiedzi:

421

Gdy kolumny nie są MultiIndex, df.columnsto tylko tablica nazw kolumn, dzięki czemu możesz:

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
źródło
13
Nieźle, ale rozwiązanie @ mike dropjest lepsze IMO. Nieco bardziej czytelny i obsługuje multiindeksy
travc
5
Zgadzam się, że użycie rozwiązania @ mike dropjest lepsze - myślę, że warto odkryć, że kolumny (jednopoziomowe) to tablice, z którymi możesz pracować, ale szczególnie w przypadku upuszczania kolumny, dropsą bardzo czytelne i działają dobrze ze złożonymi indeksami.
Marius
1
Dziękuję za tę miłą odpowiedź. co jeśli nie mam nagłówka? jak mam się skontaktować?
FabioSpaghetti,
1
A jeśli masz więcej niż 1 kolumnę do zignorowania?
Bruno Ambrozio
227

Nie używać ix. To jest przestarzałe . Najbardziej czytelnym i idiomatycznym sposobem na zrobienie tego jest 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

Zauważ, że domyślnie .drop()nie działa w miejscu; pomimo złowieszczego imienia, dfjest nietknięty tym procesem. Jeśli chcesz trwale usunąć bz df, zrób df.drop('b', inplace=True).

df.drop()akceptuje również listę etykiet, np. df.drop(['a', 'b'], axis=1)upuści kolumnę ai b.

Mikrofon
źródło
1
Działa również na multiindeksie, tak jak można się tego spodziewać. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Wygląda na to, że używasz listy vs krotki, aby określić, czy chcesz wielu kolumn (listy), czy też odwoływać się do multiindeksu (krotki).
travc
16
Bardziej czytelny: df.drop(columns='a')lub df.drop(columns=['a', 'b']). Można również wymienić columns=się index=.
BallpointBen
Nie jest to jednak przydatne, jeśli nie znasz nazw wszystkich kolumn, które chcesz upuścić.
yeliabsalohcin
Ponieważ tworzy to kopię, a nie widok / odniesienie, nie można zmodyfikować oryginalnej ramki danych za pomocą tej opcji na LHS przydziału.
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
źródło
9
Podoba mi się to podejście, ponieważ można je pominąć więcej niż jedną kolumnę.
Nischal Hp
3
@NischalHp df.drop może także pomijać więcej niż jedną kolumnę df.drop (['a', 'b'], axis = 1)
Patrick Li
2
Myślę, że warto zauważyć, że może to zmienić układ kolumn
ocean800,
1
@ ocean800 Tak, to prawda. Możesz przejść, sort=Falsejeśli chcesz uniknąć tego zachowania ( df.columns.difference(['b'], sort=False))
ayhan
64

Możesz użyć df.columns.isin()

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

Jeśli chcesz upuścić wiele kolumn, tak proste jak:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]
Tomek
źródło
12

Oto inny sposób:

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

Po prostu przekazujesz wszystkie kolumny do wyświetlenia, z wyjątkiem tej, której nie chcesz.

Salvador Dali
źródło
5

Kolejna niewielka modyfikacja @Salvador Dali umożliwia wykluczenie listy kolumn:

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

lub

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
użytkownik1718097
źródło
4

Myślę, że najlepszym sposobem jest wspomniany przez @Salvador Dali. Nie żeby inni się mylili.

Ponieważ gdy masz zestaw danych, w którym chcesz po prostu wybrać jedną kolumnę i umieścić ją w jednej zmiennej, a resztę kolumn w innej, w celach porównawczych lub obliczeniowych. Następnie upuszczenie kolumny zestawu danych może nie pomóc. Oczywiście istnieją również przypadki użycia.

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

Następnie możesz umieścić tę kolekcję kolumn w zmiennej x_colsw innej zmiennej, tak jak w x_cols1przypadku innych obliczeń.

ex: x_cols1 = data[x_cols]
Sudhi
źródło
Czy możesz wyjaśnić, dlaczego jest to osobna odpowiedź zamiast komentarza / rozszerzenia odpowiedzi Salvadora?
3

Oto jedno liniowa lambda:

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

przed :

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

po :

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
źródło