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 Réponses :
df.rename(columns={'$a':'a','$b':b})
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.
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
cela ne traitera pas son autre cas où il n'y a qu'une seule colonne renommée ...
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