pandas np.where 报Settingwithcopy warining

npwhere 报Settingwithcopy warining 用movMresult.loc[:,'ratio']也一样的报错

movMresult['ratio'] = np.where(movMresult['Value'] > movMresult['refUL'], abs(movMresult['Value']/movMresult['refUL'] -1), abs(1-movMresult['Value']/movMresult['refLL']))
movMresult['ratio'] = np.where(movMresult['Value'] > movMresult['refUL'], abs(movMresult['Value']/movMresult['refUL'] -1), abs(1-movMresult['Value']/movMresult['refLL']))
<ipython-input-73-636889bf8de1>:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  movMresult['ratio'] = np.where(movMresult['Value'] > movMresult['refUL'], abs(movMresult['Value']/movMresult['refUL'] -1), abs(1-movMresult['Value']/movMresult['refLL']))

image.png
image.png

阅读 1.6k
1 个回答

不用管它,接着奏乐,接着舞。

这个不是 np.where 的问题,这是 pandas 给出的善意警告,提醒你可能那里有问题(运行正常,然而结果可能不是你想要的),但 pandas 不能确定,毕竟它不清楚你的意图。
编程中许多警告都是可以忽略的(这十分正常),一般只有造成意想不到的问题时,我们才会重视起来。你代码这里的行为是正确的,所以这里可以不管这个警告,如果实在不想看到它,可以设置:

import pandas as pd
pd.set_option('mode.chained_assignment', None) # 除非在项目最后阶段(不该打印它给用户看),或认为自己不可能犯错的情况下才加

至于警告的原因,可以学习一下(大部分警告都有学习的必要,以防止自己给自己挖坑)。在这里是由 Pandas 中链式索引(chained indexing)带来的引用(视图,原对象)和拷贝(新对象)的问题,本质上的引用和拷贝问题也是一个经典问题了。

给你附两个链接学习一下,有出错的案例和详尽的解释:

  1. Returning a view versus a copy
  2. Explaining the SettingWithCopyWarning in pandas
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏