Pandas DataFrame行更新失败求助:SettingWithCopyWarning报错
解决Pandas DataFrame行更新失败与SettingWithCopyWarning问题
问题根源
你遇到的更新失效和警告问题,核心在于链式索引操作:df_company.iloc[j]["Quantity"]会生成一个临时的Series对象,你修改的是这个临时对象而非原DataFrame,因此更新不会生效;同时Pandas无法确定你操作的是视图还是副本,从而抛出SettingWithCopyWarning。
正确的更新方法
推荐两种可靠的方式直接操作原DataFrame:
使用
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)使用
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
相关产品推荐
相关产品推荐

