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

如何解决Pandas中SettingWithCopyWarning警告问题?

解决Pandas的SettingWithCopyWarning警告问题

嘿,我帮你搞定这个烦人的警告!这个警告本质是Pandas在提醒你:你可能在修改一个DataFrame切片的视图而非独立副本,虽然有时候不影响运行结果,但咱们彻底解决它更稳妥~

问题定位

你的代码里有几处没有明确创建DataFrame副本的地方,导致Pandas无法确定你操作的是原数据还是视图,从而触发警告。咱们逐个修复:


1. 修复df_data_refined的创建

在select_bestitem函数的第2-4步,你通过布尔索引生成了df_data_refined,这里默认返回的是视图,后续基于它的操作都会触发警告:

# 原代码
df_data_refined = df_data[df_data.iloc[:, 1].isin(brand_list)]
# 修改为:添加.copy()明确创建副本
df_data_refined = df_data[df_data.iloc[:, 1].isin(brand_list)].copy()

2. 修复case_sorting函数的返回值

在case_sorting里,你通过布尔索引生成new_file,同样需要明确创建副本:

def case_sorting(file_get, col_get, methods_get, operator_get, value_get):
    ops = {">": gt, "<": lt}
    col_get = str(col_get)
    value_get = int(value_get)
    if methods_get == "|x|":  # 小提示:判断字符串相等用==更稳妥,is是判断对象身份的
        # 添加.copy()
        new_file = file_get[ops[operator_get](file_get[col_get], value_get)].copy()
    else:
        # 添加.copy()
        new_file = file_get[ops[operator_get](file_get[col_get], np.percentile(file_get[col_get], value_get))].copy()
    return new_file

3. 优化链式索引写法

在select_bestitem的循环里,df_per_brand[brand_each] = df_data_refined[df_data_refined['브랜드'] == brand_each] 属于链式索引,建议改用.loc语法更清晰,同时也可以加.copy()强化独立性:

# 原代码
df_per_brand[brand_each] = df_data_refined[df_data_refined['브랜드'] == brand_each]
# 修改为
df_per_brand[brand_each] = df_data_refined.loc[df_data_refined['브랜드'] == brand_each, :].copy()

为什么这些修改能解决问题?

Pandas的切片操作(比如布尔索引、iloc)默认返回的是视图(和原数据共享内存),当你后续修改这个视图时,Pandas无法确定你是否有意修改原数据,所以抛出警告。通过.copy()明确创建独立副本,就能告诉Pandas:我要操作的是新的DataFrame,和原数据没关系啦~

修改完这些地方后,你再运行代码应该就不会看到那个烦人的警告了。你之前尝试用copy的思路是完全正确的,只是没覆盖到所有触发警告的切片操作而已~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:28:10