1676 votes

Supprimer une colonne d'un DataFrame Pandas

Lorsque je supprime une colonne dans un DataFrame, j'utilise :

del df['column_name']

Et ça marche très bien. Pourquoi ne puis-je pas utiliser ce qui suit ?

del df.column_name

Puisqu'il est possible d'accéder à la colonne/série en tant que df.column_name Je m'attendais à ce que ça marche.

2 votes

Notez que cette question est discutée sur Méta .

2649voto

LondonRob Points 2075

La meilleure façon de le faire dans Pandas est d'utiliser drop :

df = df.drop('column_name', 1)

1 est le axe nombre ( 0 pour les rangs et 1 pour les colonnes).

Pour supprimer la colonne sans avoir à la réaffecter df vous pouvez faire :

df.drop('column_name', axis=1, inplace=True)

Enfin, pour passer à la rubrique numéro plutôt que par colonne étiquette essayez ceci pour supprimer, par exemple, les 1ère, 2ème et 4ème colonnes :

df = df.drop(df.columns[[0, 1, 3]], axis=1)  # df.columns is zero-based pd.Index

Je travaille également avec la syntaxe "texte" pour les colonnes :

df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True)

Note : Introduit en v0.21.0 (27 octobre 2017), la méthode drop() accepte les mots-clés index/colonnes comme alternative à la spécification de l'axe.

Donc nous pouvons maintenant juste faire :

df.drop(columns=['B', 'C'])

94 votes

Est-ce que c'est recommandé sur del pour une raison quelconque ?

1 votes

@BirdJaguarIV Je ne connais pas d'amélioration des performances, mais de la lisibilité, drop est une description plus proche du SQL de l'opération en question. N'a pas pu del peut être interprété comme donnant à toutes les valeurs de cette colonne la valeur suivante NaN ?

4 votes

Je n'avais pas pensé à le lire de cette façon, mais je suppose que je suis plus habitué aux pythonismes qu'au SQL. Peut-être que cela dépend de la personne qui va le lire ? Je suis également partisan d'économiser les frappes au clavier lorsque cela est possible, toutes choses égales par ailleurs :)

1163voto

Wes McKinney Points 17545

Comme vous l'avez deviné, la bonne syntaxe est la suivante

del df['column_name']

Il est difficile de faire del df.column_name fonctionnent simplement en raison des limitations syntaxiques de Python. del df[name] est traduit en df.__delitem__(name) sous les couvertures par Python.

30 votes

Je me rends compte que c'est une très vieille "réponse", mais ma curiosité est piquée pourquoi Est-ce une limitation syntaxique de Python ? class A(object): def __init__(self): self.var = 1 crée une classe, puis a = A(); del a.var fonctionne très bien...

19 votes

@dwanderson la différence est que lorsqu'une colonne doit être supprimée, le DataFrame doit avoir sa propre gestion pour "comment le faire". Dans le cas de del df[name] il est traduit en df.__delitem__(name) qui est une méthode que DataFrame peut implémenter et modifier selon ses besoins. Dans le cas de del df.name la variable membre est supprimée sans qu'il soit possible d'exécuter un code personnalisé. Considérez votre propre exemple - pouvez-vous obtenir del a.var pour obtenir une impression de "suppression de la variable" ? Si vous le pouvez, dites-moi comment. Je ne peux pas :)

8 votes

@Yonatan Vous pouvez utiliser soit docs.python.org/3/reference/datamodel.html#object.__delattr__ ou des descripteurs pour cela : docs.python.org/3/howto/descriptor.html

273voto

Krishna Sankar Points 498

Utilisez :

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

Cela supprimera une ou plusieurs colonnes sur place. Notez que inplace=True a été ajouté dans pandas v0.13 et ne fonctionnera pas sur les versions antérieures. Dans ce cas, vous devrez réaffecter le résultat :

df = df.drop(columns, axis=1)

3 votes

Une remarque sur cette réponse : si une "liste" est utilisée, les crochets doivent être supprimés : df.drop(list,inplace=True,axis=1)

2 votes

cette réponse devrait vraiment être acceptée, car elle montre clairement la supériorité de cette méthode par rapport à del -- peut déposer plus d'une colonne à la fois.

0 votes

Je crois que si vous utilisez le kwarg des colonnes, par ex. df.drop(columns=['A', 'B']) alors vous n'avez pas besoin de spécifier axis=1 .

135voto

jezrael Points 290608

Baisse par indice

Supprimer les première, deuxième et quatrième colonnes :

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

Supprimer la première colonne :

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

Il existe un paramètre facultatif inplace de sorte que les données peuvent être modifiées sans créer de copie.

Popped

Sélection, ajout et suppression de colonnes

Supprimer la colonne column-name :

df.pop('column-name')

Exemples :

df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])

print df :

   one  two  three
A    1    2      3
B    4    5      6
C    7    8      9

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

   two  three
A    2      3
B    5      6
C    8      9

three = df.pop('three') print df :

   two
A    2
B    5
C    8

1 votes

Comment faire sauter une ligne dans les pandas ?

2 votes

@Yugi Vous pouvez utiliser un cadre de données transposé pour cela. ex - df.T.pop('A')

0 votes

@ClockSlave Cela ne modifie pas l'original. df . Vous pourrait faire df = df.T; df.pop(index); df = df.T mais cela semble excessif.

79voto

firelynx Points 56

La véritable question posée, à laquelle la plupart des réponses ne répondent pas, est la suivante :

Pourquoi je ne peux pas utiliser del df.column_name ?

Nous devons d'abord comprendre le problème, ce qui nous oblige à nous plonger dans Méthodes magiques Python .

Comme Wes souligne dans sa réponse, del df['column'] correspond à la méthode Python méthode magique df.__delitem__('column') qui est implémenté dans Pandas pour supprimer la colonne .

Cependant, comme indiqué dans le lien ci-dessus sur Méthodes magiques Python :

En fait, __del__ ne devrait presque jamais être utilisé en raison des circonstances précaires dans lesquelles il est appelé ; utilisez-le avec prudence !

On pourrait dire que del df['column_name'] ne doivent pas être utilisées ou encouragées, et donc del df.column_name ne devrait même pas être envisagée.

Cependant, en théorie, del df.column_name pourrait être implémenté pour fonctionner dans Pandas en utilisant le site méthode magique __delattr__ . Cela pose cependant certains problèmes, problèmes que l'Union européenne doit résoudre. del df['column_name'] La mise en œuvre l'a déjà fait, mais à un degré moindre.

Exemple de problème

Que se passe-t-il si je définis une colonne dans un cadre de données appelée "dtypes" ou "columns" ?

Supposons ensuite que je veuille supprimer ces colonnes.

del df.dtypes rendrait le __delattr__ La méthode ne sait pas si elle doit supprimer l'attribut "dtypes" ou la colonne "dtypes".

Questions architecturales derrière ce problème

  1. Un cadre de données est-il une collection de colonnes ?
  2. Un cadre de données est-il une collection de rangées ?
  3. Une colonne est-elle un attribut d'un cadre de données ?

Les pandas répondent :

  1. Oui, de toutes les manières
  2. Non, mais si vous voulez qu'il le soit, vous pouvez utiliser la fonction .ix , .loc ou .iloc méthodes.
  3. Peut-être, voulez-vous lire données ? Alors oui , sauf si le nom de l'attribut est déjà pris par un autre attribut appartenant au dataframe. Voulez-vous modifier données ? Alors pas de .

TLDR ;

Vous ne pouvez pas faire del df.column_name En effet, l'architecture de Pandas s'est développée de manière assez sauvage et doit être repensée pour que ce type d'opération soit possible. dissonance cognitive de ne pas se produire chez ses utilisateurs.

Un conseil de pro :

N'utilisez pas df.column_name. C'est peut-être joli, mais cela provoque dissonance cognitive .

Des citations zen de Python qui s'intègrent ici :

Il existe plusieurs façons de supprimer une colonne.

Il devrait y avoir une - et de préférence une seule - manière évidente de le faire.

Les colonnes sont parfois des attributs, mais pas toujours.

Les cas particuliers ne sont pas assez particuliers pour enfreindre les règles.

Fait del df.dtypes supprimer l'attribut dtypes ou la colonne dtypes ?

Face à l'ambiguïté, refusez la tentation de deviner.

0 votes

"En fait, __del__ ne devrait presque jamais être utilisé en raison des circonstances précaires dans lesquelles il est appelé ; utilisez-le avec précaution !" n'est absolument pas pertinent ici, car la méthode utilisée ici est __delattr__ .

1 votes

@ppperry vous faites une erreur de citation. c'est le del qui est visé, et non le .__del__ méthode d'instance. Le site del correspond à __delattr__ et __delitem__ ce qui est la base de mon argumentation. Alors peut-être que vous voulez relire ce que j'ai écrit.

1 votes

__ ... __ est interprété comme une marque en gras par StackExchange.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X