Mise à jour de la valeur dans iterrow pour pandas

je fais un travail de géocodage que j'ai utilisé selenium pour screen Scraper la coordonnée x-y dont j'ai besoin pour l'adresse d'un emplacement, j'ai importé un fichier xls à panda dataframe et je veux utiliser une boucle explicite pour mettre à jour les lignes qui n'ont pas la coordonnée x-y, 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 ne" prend " pas après que j'ai itérrows sur une base de données pandas? et je suis pleinement conscient que iterrow ne nous donne qu'un point de vue plutôt que faire si je dois mettre à jour les valeurs ligne par ligne? Est-ce que lambda est faisable?

25
demandé sur Community 2014-08-25 07:10:55

1 réponses

les lignes que vous obtenez en retour de iterrows sont des copies qui ne sont plus connectées à la base de données originale, donc les modifications ne changent pas votre base de données. Heureusement, parce que chaque élément que vous récupérez de iterrows contient l'index courant, vous pouvez l'utiliser pour accéder et éditer la ligne pertinente de la dataframe:

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']

Dans mon expérience, cette approche semble plus lent que d'utiliser une approche comme apply ou map , mais comme toujours, c'est à vous décider comment faire le compromis performance / facilité de codage.

45
répondu Marius 2014-08-25 04:04:16