Question Supprimer la colonne de pandas DataFrame en utilisant del df.column_name


Lorsque vous supprimez une colonne dans un DataFrame, j'utilise:

del df['column_name']

Et cela fonctionne très bien. Pourquoi ne puis-je pas utiliser ce qui suit?

del df.column_name

Comme vous pouvez accéder à la colonne / série en tant que df.column_name, Je m'attends à ce que cela fonctionne.


814
2017-11-16 06:26


origine


Réponses:


C'est difficile à faire del df.column_name Travailler simplement comme le résultat de limitations syntaxiques en Python. del df[name] est traduit en df.__delitem__(name) sous les couvertures par Python.


463
2017-11-21 03:12



La meilleure façon de faire cela chez les pandas est d'utiliser drop:

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

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

Pour supprimer la colonne sans avoir à réaffecter df tu peux faire:

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

Enfin, pour déposer par colonne nombre au lieu de par colonne étiquette, essayez ceci pour supprimer, par ex. les 1ère, 2ème et 4ème colonnes:

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

1529
2017-08-09 11:12



Utilisation:

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 anciennes versions. Vous devez attribuer le résultat dans ce cas:

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

178
2018-03-23 20:57



Déposer par index

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 y a un paramètre optionnel inplace de sorte que l'original les données peuvent être modifiées sans créer de copie.

Popped

Sélection de colonne, ajout, suppression

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

78
2017-07-15 13:37



La vraie question posée, ratée par la plupart des réponses ici est:

Pourquoi je ne peux pas utiliser del df.column_name?

Au début, nous devons comprendre le problème, ce qui nous oblige à plonger dans méthodes magiques python.

Comme le souligne Wes dans sa réponse del df['column'] des cartes pour le python méthode magique  df.__delitem__('column') lequel est mis en œuvre chez les pandas pour laisser tomber la colonne

Cependant, comme indiqué dans le lien ci-dessus à propos de méthodes magiques python:

En réalité, del ne devrait presque jamais être utilisé en raison des circonstances précaires dans lesquelles il est appelé; Utilisez-le avec prudence!

Vous pourriez soutenir que del df['column_name'] ne devrait pas être utilisé ou encouragé, et par conséquent del df.column_name ne devrait même pas être considéré.

Cependant, en théorie, del df.column_name pourrait être implémété à travailler chez les pandas en utilisant la méthode magique __delattr__. Ceci introduit cependant certains problèmes, problèmes que le del df['column_name'] la mise en œuvre a déjà, mais dans une moindre mesure.

Exemple de problème

Que faire si je définis une colonne dans une base de données appelée "dtypes" ou "colonnes".

Supposons ensuite que je veux supprimer ces colonnes.

del df.dtypes ferait le __delattr__ méthode confondue comme si elle devait supprimer l'attribut "dtypes" ou la colonne "dtypes".

Questions architecturales derrière ce problème

  1. Un dataframe est-il un collection de colonnes?
  2. Un dataframe est-il une collection de rangées?
  3. Est-ce une colonne attribut d'un dataframe?

Pandas répond:

  1. Oui, de toutes les façons
  2. Non, mais si vous le voulez, vous pouvez utiliser le .ix, .loc ou .iloc méthodes
  3. Peut-être, voulez-vous lis Les données? alors Oui, sauf si le nom de l'attribut est déjà pris par un autre attribut appartenant à la trame de données. Veux-tu modifier Les données? alors non.

TLDR;

Tu ne peux pas faire del df.column_name parce que les pandas ont une architecture assez sauvage qui doit être reconsidérée pour ce genre de dissonance cognitive ne pas se produire à ses utilisateurs.

Protip:

N'utilisez pas df.column_name, ça peut être joli, mais ça provoque dissonance cognitive

Zen de citations Python qui correspond ici:

Il existe plusieurs façons de supprimer une colonne.

Il devrait y avoir une - et de préférence une seule - façon évidente de le faire.

Les colonnes sont parfois des attributs mais parfois non.

Les cas spéciaux ne sont pas assez spéciaux pour enfreindre les règles.

Est-ce que del df.dtypes supprimer l'attribut dtypes ou la colonne dtypes?

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


54
2018-05-03 09:48



à partir de la version 0.16.1, vous pouvez le faire

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')

37
2018-04-30 18:57



Une belle addition est la capacité de drop colonnes seulement si elles existent. De cette façon, vous pouvez couvrir plus de cas d'utilisation, et il ne fera que supprimer les colonnes existantes des étiquettes qui lui sont passées:

Ajoutez simplement errors = 'ignore', par exemple.:

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
  • Ceci est nouveau à partir de pandas 0.16.1. La documentation est ici.

37
2018-01-03 12:29