You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame行更新失败求助:SettingWithCopyWarning报错

解决Pandas DataFrame行更新失败与SettingWithCopyWarning问题

问题根源

你遇到的更新失效和警告问题,核心在于链式索引操作:df_company.iloc[j]["Quantity"]会生成一个临时的Series对象,你修改的是这个临时对象而非原DataFrame,因此更新不会生效;同时Pandas无法确定你操作的是视图还是副本,从而抛出SettingWithCopyWarning。

正确的更新方法

推荐两种可靠的方式直接操作原DataFrame:

  1. 使用iloc同时指定行索引位置和列索引位置
    先获取"Quantity"列的位置,再通过iloc定位行和列进行更新:

    df_company = df.copy(deep=True)
    df_company = df_company[df_company["Market"] == company_name]
    df_company = df_company[df_company["Date"] < pd.to_datetime(date_start, dayfirst=True)]
    # 获取Quantity列的索引位置
    col_pos = df_company.columns.get_loc("Quantity")
    # 直接通过iloc更新指定行和列
    df_company.iloc[j, col_pos] += int(remainder_shares)
    
  2. 使用at直接按索引标签和列名更新
    at是针对标量值的高效访问方法,直接定位到行标签和列名对应的单元格:

    df_company = df.copy(deep=True)
    df_company = df_company[df_company["Market"] == company_name]
    df_company = df_company[df_company["Date"] < pd.to_datetime(date_start, dayfirst=True)]
    # 通过行索引标签和列名更新
    df_company.at[df_company.index[j], "Quantity"] += int(remainder_shares)
    

额外建议

如果你的业务逻辑允许,尽量避免循环遍历行,改用Pandas的向量化操作,这不仅更高效,还能避免这类索引操作的问题。

内容的提问来源于stack exchange,提问作者disruptive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:20:12