求助:处理DataFrame时出现“试图在切片副本上设置值”警告
解决Pandas SettingWithCopyWarning问题
问题原因
你遇到的A value is trying to be set on a copy of a slice from a DataFrame是Pandas的SettingWithCopyWarning,根源在于使用了链式索引(data_help['exports'][...])。这种写法会让Pandas无法确定你要修改的是原DataFrame还是它的临时副本,因此抛出警告提示潜在的意外行为。
朋友的电脑没出现警告,大概率是两种情况:一是他的Pandas版本较低,该警告默认未启用;二是他的data_help是独立创建的DataFrame,而非其他DataFrame的切片副本,不存在副本修改的歧义。
解决方案
方法1:使用.loc明确索引(推荐)
Pandas官方推荐用.loc来定位并修改数据,彻底避免链式索引的歧义:
percentiles = data_help['exports'].quantile([0.05, 0.95]).values data_help.loc[data_help['exports'] <= percentiles[0], 'exports'] = percentiles[0] data_help.loc[data_help['exports'] >= percentiles[1], 'exports'] = percentiles[1]
方法2:先创建DataFrame的副本
如果data_help是从其他DataFrame切片得到的,先明确创建它的副本,再执行修改操作:
# 先复制原数据,确保操作的是独立的DataFrame data_help = data_help.copy() percentiles = data_help['exports'].quantile([0.05, 0.95]).values data_help['exports'][data_help['exports'] <= percentiles[0]] = percentiles[0] data_help['exports'][data_help['exports'] >= percentiles[1]] = percentiles[1]
额外说明
链式索引的风险在于,有时你以为修改了原数据,但实际修改的是临时副本,导致原数据没有变化。始终用.loc进行赋值操作,是保证数据修改符合预期的最佳实践。
内容的提问来源于stack exchange,提问作者Brody_Brody
相关产品推荐
相关产品推荐

