1. ホーム
  2. python

[解決済み] pandas の iterrow の値を更新する。

2023-01-19 14:51:40

質問

私はジオコーディングの仕事をしており、その際に selenium を使用して、場所の住所に必要なx-y座標をスクリーンスクレイピングしています。私はxlsファイルをパンダデータフレームにインポートし、以下のようにx-y座標を持っていない行を更新するために明示的なループを使用したいと思います。

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

私が読んだのは pandasのDataFrameをiterrowした後、この関数がquot;take"されないのはなぜですか? を読んで、iterrowが編集のためのコピーではなく、ビューを提供するだけであることを十分に認識していますが、私が本当に行ごとに値を更新する場合はどうなりますか?それは lambda は実現可能でしょうか?

どのように解決するのですか?

からの戻り値の行は iterrows から戻ってくる行は、もはや元のデータフレームに接続されていないコピーであるため、編集してもデータフレームは変わりません。ありがたいことに、各項目は iterrows から戻ってくる各項目には現在のインデックスが含まれているので、それを使ってデータフレームの関連する行にアクセスし、編集することができるのです。

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

私の経験では、この方法は、以下のようなアプローチを使うよりも遅く感じます。 apply または map というように、パフォーマンスとコーディングの容易さのトレードオフをどのように行うかは、いつもどおりあなた次第です。