Exemples de comment supprimer les colonnes en double avec pandas
Créer un dataframe avec des colonnes dupliquées
Commençons par créer un dataframe avec des colonnes dupliquées
import pandas as pdimport numpy as npdata = np.random.randint(10, size=(5,3))columns = ['Score A','Score B','Score C']df = pd.DataFrame(data=data,columns=columns)data = np.random.randint(10, size=(5,2))columns = ['Score E','Score F']df_add = pd.DataFrame(data=data,columns=columns)df = pd.concat([df,df_add], axis=1)df = pd.concat([df,df_add], axis=1)print(df)
donne par exemple
Score A Score B Score C Score E Score F Score E Score F0 7 4 4 4 9 4 91 6 6 3 8 9 8 92 4 9 6 2 5 2 53 8 6 2 6 3 6 34 2 4 0 2 4 2 4
les colonnes E et F ont été dupliquées ici deux fois.
Supprimer les colonnes dupliquées
Pour supprimer ces colonnes dupliquées, une solution est de faire comme ceci:
df = df.loc[:,~df.columns.duplicated()]print(df)
donne
Score A Score B Score C Score E Score F0 7 4 4 4 91 6 6 3 8 92 4 9 6 2 53 8 6 2 6 34 2 4 0 2 4
Attention: la solution ci-dessus supprime les colonnes en fonction du nom de la colonne. Ainsi, une colonne sera supprimée même si deux colonnes ne sont pas strictement égales, illustration
import pandas as pdimport numpy as npdata = np.random.randint(10, size=(5,3))columns = ['Score A','Score B','Score C']df = pd.DataFrame(data=data,columns=columns)data = np.random.randint(10, size=(5,2))columns = ['Score E','Score F']df_add = pd.DataFrame(data=data,columns=columns)df = pd.concat([df,df_add], axis=1)df = pd.concat([df,df_add], axis=1)df.iloc[0,4] = 999print(df)
donne
Score A Score B Score C Score E Score F Score E Score F0 4 0 5 0 999 0 01 6 5 7 1 1 1 12 7 5 3 4 5 4 53 8 1 7 9 3 9 34 6 9 3 7 6 7 6
ci vous pouvez voir que les deux colonnes appelées "Score E" ne sont pas les mêmes, mais
df = df.loc[:,~df.columns.duplicated()]print(df)
donne
Score A Score B Score C Score E Score F0 4 0 5 0 9991 6 5 7 1 12 7 5 3 4 53 8 1 7 9 34 6 9 3 7 6
Pour voir comment vérifier d'abord si deux colonnes sont égales, voir la section suivante:
Obtenez les index des colonnes dupliquées et vérifiez si les colonnes sont égales
Il peut être utile de vérifier d'abord si deux colonnes sont égales.
Commençons par vérifier la colonne intitulée "Score E":
Obtenir la position de la colonne "Score E"
df.columns.get_loc("Score E")
donne
array([False, False, False, True, False, True, False])
obtenir les indices
np.where( df.columns.get_loc("Score E") )[0]
donne ici
array([3, 5])
et transfomer la matrice en liste:
A = np.where( df.columns.get_loc("Score E") )[0]print( A.tolist() )
Les indices de la colonne "Score E" sont
[3, 5]
Donc, pour vérifier si ces deux colonnes sont égales, faites simplement:
df.iloc[:,3].equals(df.iloc[:,5])
ce qui donne ici
True
Faisons la même chose avec la colonne "Score F"
np.where( df.columns.get_loc("Score F") )[0].tolist()
donne les indices de la colonne "Score F":
[4, 6]
alors si nous faisons
df.iloc[:,4].equals(df.iloc[:,6])
donne
False
les deux colonnes ne sont pas égales !
Supprimer les colonnes avec le même nom si et seulement si les éléments ne sont pas les mêmes
import pandas as pdimport numpy as npdata = np.random.randint(10, size=(5,3))columns = ['Score A','Score B','Score C']df = pd.DataFrame(data=data,columns=columns)data = np.random.randint(10, size=(5,2))columns = ['Score E','Score F']df_add = pd.DataFrame(data=data,columns=columns)df = pd.concat([df,df_add], axis=1)df = pd.concat([df,df_add], axis=1)df = pd.concat([df,df_add], axis=1)df.iloc[0,4] = 999print(df)
donne
Score A Score B Score C Score E Score F Score E Score F Score E \0 7 4 5 9 999 9 5 91 6 5 9 3 8 3 8 32 1 2 9 4 0 4 0 43 4 1 7 7 7 7 7 74 1 6 6 6 6 6 6 6Score F0 51 82 03 74 6
Solution
def get_column_index_list(column):if type( df.columns.get_loc(column) ) == int:col_index_list = []col_index_list.append( df.columns.get_loc(column) )else:col_index_list = np.where( df.columns.get_loc(column) )[0].tolist()return col_index_list#print('test', get_column_index_list('Score C') )df_new = pd.DataFrame()for column in df.columns:col_index_list = get_column_index_list(column)if column not in df_new.columns:first_col_idx = col_index_list[0]df_new = pd.concat([df_new,df.iloc[:,first_col_idx]], axis=1)if len(col_index_list) > 1:prev_col_idc = first_col_idxfor col_idx in col_index_list[1:]: # keep first columncurrent_col_idx = col_idxif not df.iloc[:,prev_col_idc].equals(df.iloc[:,current_col_idx]):df_new = pd.concat([df_new,df.iloc[:,current_col_idx]], axis=1)prev_col_idc = current_col_idxprint(df_new)
donne dans cet exemple
Score A Score B Score C Score E Score F Score F0 7 4 5 9 999 51 6 5 9 3 8 82 1 2 9 4 0 03 4 1 7 7 7 74 1 6 6 6 6 6
