1
votes

Création d'une fonction pour renommer les colonnes dans pandas dataframe

J'ai dataframe comme ci-dessous:

new_df = pd.DataFrame({'a':[1,2], 'b': [10,20]})

J'ai essayé de créer une fonction qui permet de changer le nom de la colonne dynamiquement où je peux simplement entrer l'ancien nom de colonne et le nouveau nom de colonne dans la fonction comme ci-dessous:

new_df = rename_column_name(df, ['$a','$b'] , ['a','b'])

Cette fonction n'est applicable que si je n'ai qu'une seule entrée comme ci-dessous:

new_df = pd.DataFrame({'a':[1,2], '$b': [10,20]})

qui me donne ceci new_df comme ci-dessous:

new_df = rename_column_name(df, '$a' , 'a')

Cependant, je voulais créer une fonction qui me permette d'apporter des modifications sur plusieurs / une colonne en fonction de ma préférence en tant que telle:

XXX

Et obtenez le new_df comme ci-dessous

def rename_column_name(df, old_column, new_column):
    df = df.rename({'{}'.format(old_column) : '{}'.format(new_column)}, axis=1)
    return df

Alors, comment rendre ma fonction plus dynamique pour me laisser la liberté de saisir plusieurs / les noms d'une colonne et les renommer?


3 commentaires

pourquoi ne pas simplement appeler df.rename (columns = {'$ a': 'a', '$ b': 'b'}) ... pourquoi avoir une fonction supplémentaire ici?


parce que j'ai besoin d'une fonction car j'ai plusieurs fichiers, nom de colonne à renommer.


cela n'a pas de sens pourquoi vous avez besoin d'une fonction à appeler, quand vous devez avoir le dataframe pour appeler la fonction ... et ensuite faire un tas de choses supplémentaires là-dedans


3 Réponses :


1
votes
df.rename(columns={'$a':'a','$b':b})

0 commentaires

4
votes

Vous n'avez pas besoin d'une fonction, vous pouvez le faire en utilisant dict comprehension :

In [274]: def rename_column_name(df, old_column_list, new_column_list): 
     ...:     df = df.rename(columns=dict(zip(old_column_list, new_column_list))) 
     ...:     return df 
     ...:                                                                                                                                                                                                   

In [275]: rename_column_name(df,old_names,new_names)                                                                                                                                                        
Out[275]: 
   a   b
0  1  10
1  2  20

Fonction qui OP besoins:

In [265]: old_names = df.columns.tolist()                                                                                                                                                                   

In [266]: new_names = ['a','b']                                                                                                                                                                             

In [268]: df = df.rename(columns=dict(zip(old_names, new_names)))                                                                                                                                  

In [269]: df                                                                                                                                                                                                
Out[269]: 
   a   b
0  1  10
1  2  20

Vous devez passer une liste de colonnes à cette fonction. Il peut s'agir de plusieurs colonnes ou d'une seule colonne. Cela devrait faire ce que vous recherchiez.


0 commentaires

0
votes

Vous pouvez le faire avec la fonction zip où, old_column_names et new_column_names devraient être des listes.

 def rename_column_name(df, old_column_names, new_column_names):

    //validating the such that all the new names have been passed
    if(isinstance(old_column_names, list)) and (isinstance(new_column_names, list)):
        if(len(old_column_names) == len(new_column_names)):
            df = df.rename(columns=dict(zip(old_column_names, new_column_names)), inplace=True)
    elif (isinstance(old_column_names, str)) and (isinstance(new_column_names, str)):
        df = df.rename(columns={'{}'.format(old_column_names) : '{}'.format(new_column_names)}, inplace=True)
    return df 

Pour gérer à la fois le changement de nom d'une colonne et leur transmission sous forme de listes, la fonction nécessiterait des conditions supplémentaires qui peuvent être

def rename_column_name(df, old_column_names, new_column_names):

    //validating the such that all the new names have been passed

    if(len(old_column_names) == len(new_column_names)):
        df = df.rename(columns=dict(zip(old_column_names, new_column_names)), inplace=True)
    return df  


1 commentaires

cela ne traitera pas son autre cas où il n'y a qu'une seule colonne renommée ...