web-dev-qa-db-fra.com

Suppression de plusieurs colonnes en fonction des noms de colonne dans les pandas

J'ai quelques données et lorsque je les importe, les colonnes suivantes sont inutiles. Je cherche un moyen simple de les supprimer.

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

Ils sont indexés par 0 indexation alors j'ai essayé quelque chose comme 

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

Mais ce n'est pas très efficace. J'ai essayé d'écrire quelques boucles, mais cela m'a semblé être un mauvais comportement des Pandas. Par conséquent, je pose la question ici.

J'ai vu des exemples similaires ( Déposer plusieurs colonnes pandas ) mais cela ne répond pas à ma question. 

57
Peadar Coyle

Je ne sais pas ce que vous entendez par inefficace, mais si vous parlez de dactylographie, il pourrait être plus facile de sélectionner simplement les colonnes d'intérêt et de les attribuer à nouveau au df:

df = df[cols_of_interest]

cols_of_interest est une liste des colonnes qui vous intéressent.

Ou vous pouvez couper les colonnes et passer ceci à drop:

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

L'appel à head ne sélectionne que 0 lignes car nous ne sommes intéressés que par les noms de colonnes plutôt que par les données

mettre à jour

Une autre méthode plus simple consisterait à utiliser le masque booléen de str.contains et à l’inverser pour masquer les colonnes:

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []
38
EdChum

L'approche de loin la plus simple est:

yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)
139
Philipp Schwarz

Mon préféré, et plus facile que les réponses que j'ai vu ici (pour plusieurs colonnes):

df.drop(df.columns[22:56], axis=1, inplace=True)

Ou créer une liste pour plusieurs colonnes.

col = list(df.columns)[22:56]
df.drop(col, axis=1, inplace=1)
23
sheldonzy

C'est probablement un bon moyen de faire ce que vous voulez. Il supprimera toutes les colonnes contenant «Sans nom» dans leur en-tête.

for col in df.columns:
    if 'Unnamed' in col:
        del df[col]
15
knightofni

Vous pouvez le faire en une ligne et une fois:

df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)

Cela implique moins de déplacement/copie de l'objet que les solutions ci-dessus.

8
Peter

Vous ne savez pas encore si cette solution a déjà été mentionnée, mais l’une des solutions consiste à pandas.Index.difference .

>>> df = pd.DataFrame(columns=['A','B','C','D'])
>>> df
Empty DataFrame
Columns: [A, B, C, D]
Index: []
>>> to_remove = ['A','C']
>>> df = df[df.columns.difference(to_remove)]
>>> df
Empty DataFrame
Columns: [B, D]
Index: []
7
px06

Le ci-dessous a fonctionné pour moi:

for col in df:
    if 'Unnamed' in col:
        #del df[col]
        print col
        try:
            df.drop(col, axis=1, inplace=True)
        except Exception:
            pass
1
Shivgan

df = df [[col pour col dans df.columns si 'Sans nom' n'est pas en col]]

0
Sarah