2 votes

Remplacement de plusieurs valeurs dans une colonne d'un cadre de données Python

Des milliers de valeurs doivent être remplacées par un format de dénomination plus simple. Par exemple, les noms de la trame de données originale sont AB5648, CD5678, EF5468, etc. et doivent être remplacés par HH_1, HH_2, HH_3 et ainsi de suite, conformément à la table de correspondance que j'ai créée. La table de correspondance comprend les valeurs à remplacer et à être remplacées.

Original file = df_temp 

Filename = 'HH_number_Old.csv'
Filename = 'HH_number_New.csv'

Old                     New
AB1321                 HH_1
CD5678                 HH_2
EF5468                 HH_3
EF5468                 HH_3
EF5438                 HH_4
EF5368                 HH_5
EF5068                 HH_6
EF5468                 HH_7
EF5458                 HH_8
EF5168                 HH_9
.....                 .....
XZ5465                HH_3000

Voici ce que j'ai essayé.

for i in range (3000):
    print(HH_number_old[i])
    print(HH_number_new[i])

    temp_fin = df_temp.replace({HH_contract[i], HH_no[i]}, inplace=True) 
          #temp_fin is the resultant dataframe with replaced values

Result = temp_fin file is empty.

Le remplacement fonctionne lorsque j'essaie un nombre spécifique de [i] comme ci-dessous.

temp_fin = df_temp.replace (HH_number_old[1], HH_number_new[1])

2voto

jezrael Points 290608

Utilice Series.rank :

df['new'] = 'HH_' + df['To_be_replaced'].rank(method='dense').astype(int).astype(str)

Ou GroupBy.ngroup :

df['new'] = 'HH_' + df.groupby('To_be_replaced', sort=False).ngroup().add(1).astype(str)

print (df)
  To_be_replaced To_replace   new
0         AB1321       HH_1  HH_1
1         CD5678       HH_2  HH_2
2         EF5468       HH_3  HH_3
3         EF5468       HH_3  HH_3
4         EF5468       HH_3  HH_3
5         EF5468       HH_3  HH_3
6         EF5468       HH_3  HH_3
7         EF5468       HH_3  HH_3
8         EF5468       HH_3  HH_3
9         EF5468       HH_3  HH_3

EDITAR:

Pour remplacer plusieurs autres DataFrames, utilisez :

d = dict(zip(df['To_be_replaced'], df['new']))

Et puis Series.map dans un autre DataFrame :

df1['new'] = df1['To_be_replaced'].map(d)
df2['new'] = df2['To_be_replaced'].map(d)

1voto

qxzsilver Points 16

Je vois que EF5468 est cartographié selon votre question comme étant à la fois HH_3 y HH_7 . Je suppose que ce mappage doit être unique (l'importation en tant que DataFrame et l'utilisation de la compréhension du dictionnaire devraient créer une paire clé-valeur unique).

Vous pouvez simplement utiliser une carte pour cela :

mapping_dict = {
'AB1321':                'HH_1', 
'CD5678':                'HH_2', 
'EF5468':                'HH_3',
'EF5438':                'HH_4',
'EF5368':                'HH_5',
'EF5068':                'HH_6',
'EF5458':                'HH_7',
'EF5168':                'HH_8'

df['new'] = df['old'].map(mapping_dict)

Cela devrait permettre d'obtenir les résultats souhaités, en supposant que j'ai bien compris votre question (chaque identifiant n'apparaissant qu'une seule fois) et qu'il existe une correspondance bijective (c'est-à-dire univoque et sur) entre l'ancien et le nouvel identifiant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X