it-swarm.com.de

Aktualisieren des Werts in iterrow für pandas

Ich mache einige Geokodierungsarbeiten, bei denen ich Selenium verwendet habe, um die xy-Koordinate, die ich für die Adresse eines Standorts benötige, auf dem Bildschirm abzutasten. Ich habe eine xls-Datei in Panda DataFrame importiert und möchte explizite Schleifen verwenden, um die Zeilen zu aktualisieren, die dies nicht tun haben die xy-Koordinate wie folgt:

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

Ich habe gelesen Warum "nimmt" diese Funktion nicht, nachdem ich einen pandas DataFrame? durchlaufen habe?) == und bin mir voll und ganz bewusst, dass iterrow uns nur eine Ansicht anstatt einer gibt Zum Bearbeiten kopieren, aber was ist, wenn ich den Wert wirklich zeilenweise aktualisiere? Ist lambda durchführbar?

42
lokheart

Die Zeilen, die Sie von iterrows zurückerhalten, sind Kopien, die nicht mehr mit dem ursprünglichen Datenrahmen verbunden sind, sodass Änderungen Ihren Datenrahmen nicht ändern. Da jedes Element, das Sie von iterrows zurückerhalten, den aktuellen Index enthält, können Sie damit auf die entsprechende Zeile des Datenrahmens zugreifen und diese bearbeiten:

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

Meiner Erfahrung nach scheint dieser Ansatz langsamer zu sein als die Verwendung eines Ansatzes wie apply oder map, aber wie immer liegt es an Ihnen, zu entscheiden, wie Sie die Leistung/die Einfachheit des Codierungskompromisses verbessern möchten.

70
Marius