【问题标题】:Updating value in iterrow for pandas为熊猫更新 iterrow 中的值
【发布时间】:2014-10-18 04:01:41
【问题描述】:

我正在做一些地理编码工作,我使用selenium 来筛选我需要的位置地址的 xy 坐标,我将一个 xls 文件导入熊猫数据框并希望使用显式循环来更新不有 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']

我已阅读Why doesn't this function "take" after I iterrows over a pandas DataFrame? 并完全意识到 iterrow 只为我们提供了一个视图而不是用于编辑的副本,但是如果我真的要逐行更新值怎么办? lambda可行吗?

【问题讨论】:

  • 认为你可以做rche_df.loc[index, 'wgs1984_latitude'] = dict_temp['lat'],即使用索引来获取原始数据框的正确部分。如果这不起作用,请告诉我,我会尝试找到正确的答案。
  • @Marius 看起来可以工作了,谢谢,另一种选择是将数据帧转换为 dict 并使用普通的 for 循环进行修改
  • 这个答案对我不起作用(为什么在地球上不...),但这样做:stackoverflow.com/questions/23330654/…

标签: python loops pandas explicit


【解决方案1】:

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

根据我的经验,这种方法似乎比使用 applymap 之类的方法要慢,但与往常一样,如何在性能/编码易用性之间进行权衡取决于您。

【讨论】:

  • 这不是完全正确的,它们可能不是副本。特别是如果所有列的 dtype 都相同
  • 这给了我一个复制警告。最终使用:stackoverflow.com/questions/33518124/…
  • 你还是没有找回索引吗?请参阅@jpp 对Pandas for loop over dataframe gives too many values to unpack 的回答。我从这个答案的代码中得到的错误是ValueError: too many values to unpack (expected 2)
  • 我发现我必须运行 df = df.reset_index() 才能使其正常工作而不会出现索引错误,因为我已经切碎并切片了我的数据帧。
【解决方案2】:

基于this question的另一种方式:

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

This link 描述.loc.at 之间的区别。很快,.at.loc 快。

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 2017-03-23
    • 2018-02-01
    • 2018-12-29
    • 2020-04-08
    • 2019-07-28
    相关资源
    最近更新 更多