web-dev-qa-db-fra.com

Mise à jour de la valeur dans iterrow pour pandas

Je fais un travail de géocodage que j'ai utilisé Selenium pour filtrer la coordonnée xy dont j'ai besoin pour l'adresse d'un emplacement, j'ai importé un fichier xls dans panda dataframe et je souhaite utiliser une boucle explicite pour mettre à jour les lignes qui ne le sont pas. avoir la coordonnée xy, comme ci-dessous:

for index, row in rche_df.iterrows():
    if isinstance(row.wgs1984_latitude, float):
        row = row.copy()
        target = row.address_chi        
        dict_temp = geocoding(target)
        row.wgs1984_latitude = dict_temp['lat']
        row.wgs1984_longitude = dict_temp['long']

J'ai lu Pourquoi cette fonction "prend-elle" après que j'aie traversé un pandas DataFrame? et suis pleinement conscient du fait qu'iterrow ne nous donne qu'une vue plutôt qu'un copier pour le modifier, mais que se passe-t-il si je souhaite réellement mettre à jour la valeur ligne par ligne? lambda est-il faisable?

42
lokheart

Les lignes que vous récupérez de iterrows sont des copies qui ne sont plus connectées au cadre de données d'origine. Par conséquent, les modifications ne modifient pas votre cadre de données. Heureusement, comme chaque élément que vous récupérez de iterrows contient l'index actuel, vous pouvez l'utiliser pour accéder à la ligne correspondante du cadre de données et la modifier:

for index, row in rche_df.iterrows():
    if isinstance(row.wgs1984_latitude, float):
        row = row.copy()
        target = row.address_chi        
        dict_temp = geocoding(target)
        rche_df.loc[index, 'wgs1984_latitude'] = dict_temp['lat']
        rche_df.loc[index, 'wgs1984_longitude'] = dict_temp['long']

D'après mon expérience, cette approche semble plus lente que d'utiliser une approche telle que apply ou map, mais comme toujours, il vous appartient de décider comment faire le compromis performance/facilité de codage.

70
Marius