python dataframe pandas supprime la colonne en utilisant int


155

Je comprends que pour supprimer une colonne, vous utilisez df.drop ('nom de la colonne', axis = 1). Existe-t-il un moyen de supprimer une colonne en utilisant un index numérique au lieu du nom de la colonne?


Je suppose que cela ne fonctionnera pas pour les raisons indiquées ici: stackoverflow.com/questions/13411544/…
John

Réponses:


168

Vous pouvez supprimer la colonne sur l' iindex comme ceci:

df.drop(df.columns[i], axis=1)

Cela pourrait fonctionner bizarrement, si vous avez des noms en double dans les colonnes, vous pouvez donc renommer la colonne que vous souhaitez supprimer par un nouveau nom. Ou vous pouvez réaffecter DataFrame comme ceci:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]

4
Je pense que vous avez manqué le point - ils veulent déposer par index, pas par étiquette. La conversion de l'index en une étiquette est simplement en baisse par étiquette :(
Darren

Comment indexer les cols, si je dois supprimer 100 colonnes continues au milieu de la trame de données
Sai Kiran

113

Déposez plusieurs colonnes comme ceci:

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=Trueest utilisé pour effectuer les modifications dans la trame de données elle-même sans faire tomber la colonne sur une copie de la trame de données. Si vous devez conserver votre original intact, utilisez:

df_after_dropping = df.drop(df.columns[cols],axis=1)

3
À quoi sert l'argument en place?
sidpat

12
si vous ne l'utilisez pas, inplace=Truevous devrez le faire df = df.drop()si vous voulez voir le changement en dfsoi.
muon

Comment indexer les cols, si je dois supprimer 100 colonnes continues au milieu du bloc de données.
Sai Kiran

36

S'il y a plusieurs colonnes avec des noms identiques, les solutions données ici jusqu'à présent supprimeront toutes les colonnes, ce qui peut ne pas être ce que l'on recherche. Cela peut être le cas si l'on essaie de supprimer les colonnes en double sauf une instance. L'exemple ci-dessous clarifie cette situation:

# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y']) 


df
Out[495]: 
   x  x   y
0  0  0   6
1  1  1   7
2  2  2   8
3  3  3   9
4  4  4  10

# attempting to drop the first column according to the solution offered so far     
df.drop(df.columns[0], axis = 1) 
   y
0  6
1  7
2  8
3  9
4  10

Comme vous pouvez le voir, les deux colonnes X ont été supprimées. Solution alternative:

column_numbers = [x for x in range(df.shape[1])]  # list of columns' integer indices

column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column

   x  y
0  0  6
1  1  7
2  2  8
3  3  9
4  4  10

Comme vous pouvez le voir, cela n'a vraiment supprimé que la 0ème colonne (premier «x»).


1
Tu es mon héro. J'essayais de penser à une manière intelligente de le faire pendant trop longtemps.
ATK7474

5

Vous devez identifier les colonnes en fonction de leur position dans le dataframe. Par exemple, si vous souhaitez supprimer (supprimer) les numéros de colonne 2,3 et 5, ce sera,

df.drop(df.columns[[2,3,5]], axis = 1)

4

Si vous avez deux colonnes avec le même nom. Un moyen simple consiste à renommer manuellement les colonnes comme ceci: -

df.columns = ['column1', 'column2', 'column3']

Ensuite, vous pouvez déposer via l'index de colonne comme vous l'avez demandé, comme ceci: -

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

df.column[1] supprimera l'index 1.

Souvenez-vous que l'axe 1 = colonnes et l'axe 0 = lignes.


3

si vous voulez vraiment le faire avec des entiers (mais pourquoi?), vous pouvez créer un dictionnaire.

col_dict = {x: col for x, col in enumerate(df.columns)}

puis df = df.drop(col_dict[0], 1)fonctionnera comme vous le souhaitez

edit: vous pouvez le mettre dans une fonction qui le fait pour vous, bien que de cette façon, il crée le dictionnaire à chaque fois que vous l'appelez

def drop_col_n(df, col_n_to_drop):
    col_dict = {x: col for x, col in enumerate(df.columns)}
    return df.drop(col_dict[col_n_to_drop], 1)

df = drop_col_n(df, 2)

1

Vous pouvez utiliser la ligne suivante pour supprimer les deux premières colonnes (ou toute colonne dont vous n'avez pas besoin):

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

Référence


-1

Puisqu'il peut y avoir plusieurs colonnes avec le même nom, nous devons d'abord renommer les colonnes. Voici le code de la solution.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.