web-dev-qa-db-fra.com

Comment sélectionner toutes les colonnes, sauf une colonne dans les pandas?

J'ai un dataframe ressembler à ceci:

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

Comment puis-je obtenir toutes les colonnes sauf column b?

186
markov zain

Lorsque vous ne disposez pas d'un MultiIndex, df.columns n'est qu'un tableau de noms de colonnes, ce qui vous permet d'effectuer les tâches suivantes:

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
283
Marius

N'utilisez pas ix. C'est obsolète . Le moyen le plus lisible et idiomatique de le faire est 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

Notez que par défaut, .drop() ne fonctionne pas in-situ; malgré le nom sinistre, df est indemne de ce processus. Si vous voulez supprimer définitivement b de df, faites df.drop('b', inplace=True).

df.drop() accepte également une liste d'étiquettes, par exemple. df.drop(['a', 'b'], axis=1) supprimera la colonne a et b.

168
Mike
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
96
ayhan

Vous pouvez utiliser df.columns.isin()

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

Lorsque vous souhaitez supprimer plusieurs colonnes, il suffit de:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]
37
Tom

Voici un autre moyen:

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

Vous ne faites que passer toutes les colonnes à afficher sauf celle que vous ne voulez pas.

11
Salvador Dali

Une autre légère modification apportée à @Salvador Dali permet à une liste de colonnes d’exclure:

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

ou

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
4
user1718097

Je pense que la meilleure façon de faire est la voie mentionnée par @Salvador Dali. Non pas que les autres aient tort.

Parce que lorsque vous avez un ensemble de données dans lequel vous souhaitez simplement sélectionner une colonne et la placer dans une variable, le reste des colonnes dans une autre à des fins de comparaison ou de calcul. Ensuite, supprimer la colonne du jeu de données peut ne pas aider. Bien sûr, il existe également des cas d'utilisation.

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

Ensuite, vous pouvez mettre ces collections de colonnes dans la variable x_cols dans une autre variable telle que x_cols1 pour d’autres calculs.

ex: x_cols1 = data[x_cols]
3
Sudhi