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

280

J'ai une trame de données qui ressemble à 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?

markov zain
la source
@ cs95 - La cible de doublons actuellement répertoriée n'est pas un doublon. Malgré le titre original, la question liée est "Pourquoi cette syntaxe spécifique ne fonctionne-t-elle pas", alors que cette question est plus générale "Quelle est la meilleure façon de procéder?". - Ajoutez à cela la différence entre la suppression d'une colonne d'un DataFrame existant et la création d'un nouveau DataFrame avec toutes les colonnes sauf une.
RM
@RM Je suis désolé, mais je ne suis pas d'accord avec la modification que vous avez apportée au titre de ce message, je l'ai donc annulé. Il est vrai que l'intention de l'OP était de remettre en question la syntaxe, mais la publication s'est développée pour répondre à la question plus large de savoir comment supprimer une colonne. Les réponses dans ce post sont des copies conformes du post le plus voté. Le dupe reste.
cs95
Notez que cette question est en cours de discussion sur Meta .
Heretic Monkey

Réponses:

422

Lorsque les colonnes ne sont pas un MultiIndex, il df.columnss'agit simplement d'un tableau de noms de colonnes afin que vous puissiez faire:

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
la source
13
Pas mal, mais la solution de @ mike utilisant dropest meilleure IMO. Un peu plus lisible et gère les multi
index
5
Je suis en fait d'accord pour dire que l'utilisation de la solution de @ mike dropest meilleure - je pense qu'il est utile de découvrir que les colonnes (à un niveau) sont des tableaux avec lesquels vous pouvez travailler, mais spécifiquement pour supprimer une colonne, dropest très lisible et fonctionne bien avec des index complexes.
Marius
1
Merci pour cette grande réponse. que faire si je n'ai pas d'en-tête? comment dois-je m'adresser?
FabioSpaghetti
1
Qu'en est-il lorsque vous avez plus d'une colonne à ignorer?
Bruno Ambrozio
@Marius Est-ce que cela fonctionne avec plusieurs colonnes (disons deux)?
MasayoMusic
228

Ne pas utiliser ix. C'est obsolète . La façon la 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 sur place; malgré le nom inquiétant, dfest indemne de ce processus. Si vous souhaitez supprimer définitivement bde 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 aet b.

Mike
la source
1
Fonctionne également sur un multi-index comme vous vous y attendez. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Semble utiliser liste vs tuple pour déterminer si vous voulez plusieurs colonnes (liste) ou faire référence à un multiindex (tuple).
travc
16
Plus lisible: df.drop(columns='a')ou df.drop(columns=['a', 'b']). Peut également remplacer columns=par index=.
BallpointBen
Cependant, cela n'est pas utile si vous ne connaissez pas le nom de toutes les colonnes que vous souhaitez supprimer.
yeliabsalohcin
1
Étant donné que cela crée une copie et non une vue / référence, vous ne pouvez pas modifier la trame de données d'origine en l'utilisant sur le LHS d'une affectation.
Jan Christoph Terasa
@JanChristophTerasa Savez-vous par hasard comment modifier ces colonnes sélectionnées dans le df d'origine (comme multiplier toutes ces colonnes par les valeurs d'une autre colonne). Si je modifie ces valeurs, j'aurais besoin de clouer sur la colonne supprimée à la fin, ce qui ne semble pas être le meilleur moyen.
MasayoMusic
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
la source
9
J'aime cette approche car elle peut être utilisée pour omettre plus d'une colonne.
Nischal Hp
3
@NischalHp df.drop peut également omettre plus d'une colonne df.drop (['a', 'b'], axe = 1)
Patrick Li
2
Je pense que cela vaut la peine de noter que cela peut réorganiser vos colonnes
ocean800
1
@ ocean800 Oui c'est vrai. Vous pouvez passer sort=Falsesi vous voulez éviter ce comportement ( df.columns.difference(['b'], sort=False))
ayhan
65

Vous pouvez utiliser df.columns.isin()

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

Lorsque vous souhaitez supprimer plusieurs colonnes, aussi simple que:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]
À M
la source
12

Voici une autre façon:

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

Vous passez juste toutes les colonnes à afficher sauf celle que vous ne voulez pas.

Salvador Dali
la source
5

Une autre légère modification de @Salvador Dali permet d'exclure une liste de colonnes:

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]]]
user1718097
la source
4

Je pense que la meilleure façon de procéder est celle mentionnée par @Salvador Dali. Non pas que les autres se trompent.

Parce que lorsque vous avez un ensemble de données où vous souhaitez simplement sélectionner une colonne et la placer dans une variable et le reste des colonnes dans une autre à des fins de comparaison ou de calcul. Ensuite, supprimer la colonne de l'ensemble 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 cette collection de colonnes en variable x_colsdans une autre variable comme x_cols1pour d'autres calculs.

ex: x_cols1 = data[x_cols]
Sudhi
la source
Pouvez-vous expliquer pourquoi il s'agit d'une réponse distincte au lieu d'un commentaire / d'une extension de la réponse de Salvador?
3

Voici un lambda d'une ligne:

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

avant :

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

après :

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
la source