Pandas DataFrame赋值报错cannot set using a slice indexer如何解决
Pandas替换CRIM列前10大值为第10大值的解决方法
错误原因
你原有代码的问题主要有两点:
- 赋值长度不匹配:左侧
df['CRIM'].sort_values()[-10:]是包含10个元素的序列,右侧df['CRIM'].sort_values()[-10:-9]是仅包含1个元素的序列,Pandas不支持不同长度的切片索引赋值,因此抛出对应报错。 - 赋值对象错误:
sort_values()方法返回的是原列排序后的新副本,直接对该副本赋值不会修改原DataFrame的实际数据,即便解决长度问题也无法达到预期效果。
正确实现方案
推荐使用nlargest方法实现,逻辑更简洁高效:
# 获取CRIM列第10大的数值 tenth_max = df['CRIM'].nlargest(10).iloc[-1] # 获取CRIM列前10大值对应的行索引 top10_index = df['CRIM'].nlargest(10).index # 批量给前10大值的位置赋值为第10大值 df.loc[top10_index, 'CRIM'] = tenth_max
如果需要沿用sort_values的写法,调整后如下:
# 降序排序CRIM列,保留和原DataFrame关联的索引 sorted_crim = df['CRIM'].sort_values(ascending=False) # 取第10大的数值(索引从0开始计数,第10位对应下标9) tenth_max = sorted_crim.iloc[9] # 对原DataFrame中前10大值对应的行赋值 df.loc[sorted_crim.index[:10], 'CRIM'] = tenth_max
内容的提问来源于stack exchange,提问作者hy o
相关产品推荐
相关产品推荐

