如何解决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
相关产品推荐
相关产品推荐

