在iterrow中为pandas更新值

lok*_*art 50 python loops explicit pandas

我正在进行一些地理编码工作,我曾经用selenium屏幕抓取我需要的位置地址的xy坐标,我将xls文件导入到panda数据帧,并希望使用显式循环来更新没有xy坐标的行,如下面:

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']
Run Code Online (Sandbox Code Playgroud)

我已经读过为什么在我对一个pandas DataFrame进行操作后,这个函数"没有"?并且我完全清楚iterrow只给了我们一个视图而不是一个副本进行编辑,但如果我真的要逐行更新值呢?是否lambda可行?

Mar*_*ius 85

您从中返回的行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']
Run Code Online (Sandbox Code Playgroud)

根据我的经验,这种方法似乎比使用的方法一样慢applymap,但一如既往,这是由你来决定如何使性能/易于编程的权衡.

  • 这不是严格正确的,它们可能不是副本。特别是如果所有列的 dtype 都相同 (2认同)
  • 这给了我一个复制警告。最终使用:/sf/ask/2346268711/ (2认同)
  • 我发现我必须运行“df = df.reset_index()”才能使其正常工作而不会出现索引错误,因为我已经对数据帧进行了切碎和切片。 (2认同)

Ali*_*chi 11

基于这个问题的另一种方法:

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.at[index, 'wgs1984_latitude'] = dict_temp['lat']
        rche_df.at[index, 'wgs1984_longitude'] = dict_temp['long']
Run Code Online (Sandbox Code Playgroud)

此链接.loc描述了和之间的区别.at。很快,.at比 还要快.loc