Lors de la suppression d'une colonne dans un DataFrame que j'utilise:
del df['column_name']
Et cela fonctionne très bien. Pourquoi ne puis-je pas utiliser les éléments suivants?
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 cela fonctionne.
Réponses:
Comme vous l'avez deviné, la bonne syntaxe est
Il est difficile de faire
del df.column_name
fonctionner simplement en raison des limitations syntaxiques de Python.del df[name]
est traduitdf.__delitem__(name)
sous les couvertures par Python.la source
class A(object): def __init__(self): self.var = 1
met en place une classe, puisa = A(); del a.var
fonctionne très bien ...del df[name]
, il est traduit endf.__delitem__(name)
une méthode que DataFrame peut implémenter et modifier selon ses besoins. Dans le cas dedel df.name
, la variable membre est supprimée sans possibilité d'exécution de code personnalisé. Prenons votre propre exemple - pouvez-vous obtenirdel a.var
une impression de "suppression de variable"? Si vous le pouvez, dites-moi comment. Je ne peux pas :)pandas
développeurs ne l'ont pas fait , mais cela ne signifie pas que c'est difficile à faire.La meilleure façon de le faire chez les pandas est d'utiliser
drop
:où
1
est le numéro de l' axe (0
pour les lignes et les1
colonnes.)Pour supprimer la colonne sans avoir à réaffecter,
df
vous pouvez faire:Enfin, pour supprimer par numéro de colonne plutôt que par étiquette de colonne , essayez de supprimer, par exemple les 1ère, 2e et 4e colonnes:
Fonctionne également avec la syntaxe "texte" pour les colonnes:
la source
del
pour une raison quelconque?drop
overdel
est qu'ildrop
vous permet de supprimer plusieurs colonnes à la fois, d'effectuer l'opération sur place ou non, et également de supprimer des enregistrements le long de n'importe quel axe (particulièrement utile pour une matrice 3D ouPanel
)drop
overdel
est que drop fait partie de l'API pandas et contient de la documentation.Utilisation:
Cela supprimera une ou plusieurs colonnes en place. Notez que cela a
inplace=True
été ajouté dans pandas v0.13 et ne fonctionnera pas sur les anciennes versions. Vous devez attribuer le résultat dans ce cas:la source
df.drop(list,inplace=True,axis=1)
del
- peut supprimer plus d'une colonne à la fois.Déposer par index
Supprimer les première, deuxième et quatrième colonnes:
Supprimer la première colonne:
Il existe un paramètre facultatif
inplace
pour que les données d'origine puissent être modifiées sans créer de copie.Sauté
Sélection, ajout, suppression de colonnes
Supprimer la colonne
column-name
:Exemples:
print df
:df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:three = df.pop('three')
print df
:la source
df.T.pop('A')
df
. Vous pourriez le fairedf = df.T; df.pop(index); df = df.T
mais cela semble excessif.df.drop(df.columns[[0]], axis=1, inplace=True)
cela ne serait-il pas suffisant d'utiliserdf.drop([0], axis=1)
?0
, celadf.drop(0, axis=1)
fonctionne bien. Mais si vous ne connaissez pas le nom de la colonne et que vous devez supprimer la première colonnedf.drop(df.columns[[0]], axis=1, inplace=True)
, vous avez besoin , sélectionnez la première colonne par position et déposez-la.La vraie question posée, manquée par la plupart des réponses ici est:
Pourquoi ne puis-je pas l'utiliser
del df.column_name
?Au début, nous devons comprendre le problème, ce qui nous oblige à plonger dans les méthodes magiques de python .
Comme Wes le souligne dans sa réponse, il
del df['column']
mappe la méthode magique pythondf.__delitem__('column')
qui est implémentée dans les pandas pour supprimer la colonneCependant, comme indiqué dans le lien ci-dessus sur les méthodes magiques de python :
Vous pourriez dire que cela
del df['column_name']
ne devrait pas être utilisé ou encouragé, etdel df.column_name
ne devrait donc même pas être pris en considération.Cependant, en théorie,
del df.column_name
pourrait être implémenté pour fonctionner chez les pandas en utilisant la méthode magique__delattr__
. Cela introduit cependant certains problèmes, problèmes que ladel df['column_name']
mise en œuvre a déjà, mais dans une moindre mesure.Exemple de problème
Et si je définis une colonne dans une trame de données appelée "dtypes" ou "colonnes".
Supposez ensuite que je souhaite supprimer ces colonnes.
del df.dtypes
rendrait la__delattr__
méthode confuse comme si elle devait supprimer l'attribut "dtypes" ou la colonne "dtypes".Questions architecturales derrière ce problème
Pandas répond:
.ix
,.loc
ou les.iloc
méthodes.TLDR;
Vous ne pouvez pas le faire
del df.column_name
parce que les pandas ont une architecture assez développée qui doit être reconsidérée afin que ce type de dissonance cognitive ne se produise pas pour ses utilisateurs.Protip:
N'utilisez pas df.column_name, c'est peut-être joli, mais cela provoque une dissonance cognitive
Citations Zen of Python qui s'inscrivent ici:
Il existe plusieurs façons de supprimer une colonne.
Les colonnes sont parfois des attributs mais parfois non.
Ne
del df.dtypes
supprimez l'attribut dtypes ou la colonne dtypes?la source
__del__
ne devrait presque jamais être utilisé en raison des circonstances précaires dans lesquelles il est appelé; utilisez-le avec prudence!" est complètement hors de propos ici, tout comme la méthode utilisée ici__delattr__
.del
intégrée qui est destinée, pas la.__del__
méthode d'instance. Ledel
builtin est mappé__delattr__
et sur__delitem__
lequel je construis mon argument. Alors peut-être que vous voulez relire ce que j'ai écrit.__
...__
est interprété comme un marquage gras par StackExchangeUn ajout intéressant est la possibilité de supprimer des colonnes uniquement si elles existent . De cette façon, vous pouvez couvrir plus de cas d'utilisation et il ne supprimera que les colonnes existantes des étiquettes qui lui sont passées:
Ajoutez simplement errors = 'ignore' , par exemple .:
la source
à partir de la version 0.16.1, vous pouvez le faire
la source
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, si une telle application le souhaite!Il est recommandé de toujours utiliser la
[]
notation. Une des raisons est que la notation d'attribut (df.column_name
) ne fonctionne pas pour les indices numérotés:la source
Pandas 0.21+ réponse
La version 0.21 de Pandas a
drop
légèrement modifié la méthode pour inclure à la fois les paramètresindex
etcolumns
afin de correspondre à la signature des méthodesrename
etreindex
.Personnellement, je préfère utiliser le
axis
paramètre pour désigner des colonnes ou un index car c'est le paramètre de mot-clé prédominant utilisé dans presque toutes les méthodes pandas. Mais, maintenant, vous avez des choix supplémentaires dans la version 0.21.la source
Dans pandas 0.16.1+, vous ne pouvez supprimer des colonnes que si elles existent selon la solution publiée par @eiTanLaVi. Avant cette version, vous pouvez obtenir le même résultat via une compréhension de liste conditionnelle:
la source
TL; DR
Beaucoup d'efforts pour trouver une solution légèrement plus efficace. Difficile de justifier la complexité supplémentaire tout en sacrifiant la simplicité de
df.drop(dlst, 1, errors='ignore')
Préambule La
suppression d'une colonne équivaut sémantiquement à la sélection des autres colonnes. Je vais vous montrer quelques méthodes supplémentaires à considérer.
Je vais également me concentrer sur la solution générale de supprimer plusieurs colonnes à la fois et de permettre la tentative de suppression de colonnes non présentes.
L'utilisation de ces solutions est générale et fonctionnera également pour le cas simple.
Configuration
Considérez la
pd.DataFrame
df
et liste supprimerdlst
Le résultat devrait ressembler à:
Puisque j'assimile la suppression d'une colonne à la sélection des autres colonnes, je vais la diviser en deux types:
Sélection d'étiquette
Nous commençons par fabriquer la liste / tableau d'étiquettes qui représentent les colonnes que nous voulons conserver et sans les colonnes que nous voulons supprimer.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Colonnes des étiquettes
Pour comparer le processus de sélection, supposons:
Ensuite, nous pouvons évaluer
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Que tous évaluent:
Tranche booléenne
Nous pouvons construire un tableau / liste de booléens pour le découpage
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Colonnes de Boolean
Par souci de comparaison
df.loc[: bools]
Que tous évaluent:
Synchronisation robuste
Les fonctions
Essai
C'est relatif au temps qu'il faut pour s'exécuter
df.drop(dlst, 1, errors='ignore')
. Il semble qu'après tous ces efforts, nous n'améliorons que modestement les performances.Si en fait les meilleures solutions utilisent
reindex
oureindex_axis
sur le hacklist(set(df.columns.values.tolist()).difference(dlst))
. Une seconde proche et toujours très légèrement meilleure que ladrop
précédentenp.setdiff1d
.la source
La syntaxe des points fonctionne en JavaScript, mais pas en Python.
del df['column_name']
del df['column_name']
oudel df.column_name
la source
Si votre trame de données d'origine
df
n'est pas trop volumineuse, vous n'avez pas de contraintes de mémoire et vous n'avez qu'à conserver quelques colonnes, alors vous pourriez aussi bien créer une nouvelle trame de données avec uniquement les colonnes dont vous avez besoin:la source
Nous pouvons supprimer ou supprimer une colonne spécifiée ou des colonnes sprcified par la méthode drop () .
Supposons que df soit une trame de données.
Colonne à supprimer = colonne0
Pour supprimer plusieurs colonnes col1, col2,. . . , coln, nous devons insérer toutes les colonnes qui devaient être supprimées dans une liste. Supprimez-les ensuite par la méthode drop ().
J'espère que ce serait utile.
la source
df = df.drop([col1, col2, . . . , coln], axis=1)
cela ne fonctionne pas si je spécifie un nom de variable à la place de col1, col2 etc. J'obtiens une colonne d'erreur non dans l'axe lorsqu'elle est définitivement présente. @Littin Pourriez-vous aider?Une autre façon de supprimer une colonne dans Pandas DataFrame
si vous ne recherchez pas la suppression sur place, vous pouvez créer un nouveau DataFrame en spécifiant les colonnes en utilisant la
DataFrame(...)
fonction commeCréez un nouveau DataFrame en tant que
Vous obtenez un résultat aussi bon que ce que vous obtenez avec del / drop
la source