Pandas链式赋值定位与SettingWithCopyWarning问题解决求助
问题分析与解决
首先,你怀疑的df_grouped = df1.groupby(['Item']).sum()并不是触发警告的原因,真正问题出在:df_date_extract = df_grouped.loc[:,startwk:endwk]
这行代码返回的可能是df_grouped的视图而非独立副本,当你后续通过df_date_extract.loc[:,'Row_Total']新增列时,Pandas无法确定你要修改原数据还是副本,于是抛出警告。
解决方法
方法1:显式创建副本
在获取切片时添加.copy(),强制生成独立的DataFrame副本:
def get_max_item(startwk, endwk): df1 = pd.read_csv('data.csv') df_grouped = df1.groupby(['Item']).sum() # 显式创建副本,避免视图/副本混淆 df_date_extract = df_grouped.loc[:,startwk:endwk].copy() df_date_extract.loc[:,'Row_Total'] = df_date_extract.sum(numeric_only=True, axis=1) df_max_item = df_date_extract[df_date_extract['Row_Total']==df_date_extract['Row_Total'].max()] return df_max_item.index[0]
方法2:使用assign方法新增列(更简洁安全)
assign方法会返回全新的DataFrame,彻底规避视图/副本的问题:
def get_max_item(startwk, endwk): df1 = pd.read_csv('data.csv') df_grouped = df1.groupby(['Item']).sum() df_date_extract = df_grouped.loc[:,startwk:endwk] # 用assign新增列,自动返回新DataFrame df_with_total = df_date_extract.assign(Row_Total=df_date_extract.sum(numeric_only=True, axis=1)) df_max_item = df_with_total[df_with_total['Row_Total']==df_with_total['Row_Total'].max()] return df_max_item.index[0]
方法3:一步到位的优化写法
省去多余中间变量,让逻辑更紧凑:
def get_max_item(startwk, endwk): df1 = pd.read_csv('data.csv') return (df1.groupby(['Item']) .sum() .loc[:, startwk:endwk] .assign(Row_Total=lambda x: x.sum(numeric_only=True, axis=1)) .nlargest(1, 'Row_Total') .index[0])
翻译后的报错信息
......:125: SettingWithCopyWarning: 正尝试在DataFrame切片的副本上设置值。 请尝试使用.loc[行索引器,列索引器] = 值 的方式替代 查看文档中的注意事项: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df_date_extract.loc[:,'Row_Total'] = df_date_extract.sum(numeric_only=True, axis=1)
内容的提问来源于stack exchange,提问作者Neil White
相关产品推荐
相关产品推荐

