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 pd
import numpy as np
data = 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 F
0 7 4 4 4 9 4 9
1 6 6 3 8 9 8 9
2 4 9 6 2 5 2 5
3 8 6 2 6 3 6 3
4 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 F
0 7 4 4 4 9
1 6 6 3 8 9
2 4 9 6 2 5
3 8 6 2 6 3
4 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 pd
import numpy as np
data = 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] = 999
print(df)
donne
Score A Score B Score C Score E Score F Score E Score F
0 4 0 5 0 999 0 0
1 6 5 7 1 1 1 1
2 7 5 3 4 5 4 5
3 8 1 7 9 3 9 3
4 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 F
0 4 0 5 0 999
1 6 5 7 1 1
2 7 5 3 4 5
3 8 1 7 9 3
4 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 pd
import numpy as np
data = 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] = 999
print(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 9
1 6 5 9 3 8 3 8 3
2 1 2 9 4 0 4 0 4
3 4 1 7 7 7 7 7 7
4 1 6 6 6 6 6 6 6
Score F
0 5
1 8
2 0
3 7
4 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_idx
for col_idx in col_index_list[1:]: # keep first column
current_col_idx = col_idx
if 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_idx
print(df_new)
donne dans cet exemple
Score A Score B Score C Score E Score F Score F
0 7 4 5 9 999 5
1 6 5 9 3 8 8
2 1 2 9 4 0 0
3 4 1 7 7 7 7
4 1 6 6 6 6 6