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.
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]
Où 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: []
L'approche de loin la plus simple est:
yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)
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)
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]
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.
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: []
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
df = df [[col pour col dans df.columns si 'Sans nom' n'est pas en col]]