Comment supprimer les colonnes en double avec pandas ?

Published: 28 février 2021

Tags: Python; Pandas; DataFrame;

DMCA.com Protection Status

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

Références