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']))
不用管它,接着奏乐,接着舞。
这个不是
np.where
的问题,这是pandas
给出的善意警告,提醒你可能那里有问题(运行正常,然而结果可能不是你想要的),但pandas
不能确定,毕竟它不清楚你的意图。编程中许多警告都是可以忽略的(这十分正常),一般只有造成意想不到的问题时,我们才会重视起来。你代码这里的行为是正确的,所以这里可以不管这个警告,如果实在不想看到它,可以设置:
至于警告的原因,可以学习一下(大部分警告都有学习的必要,以防止自己给自己挖坑)。在这里是由 Pandas 中链式索引(chained indexing)带来的引用(视图,原对象)和拷贝(新对象)的问题,本质上的引用和拷贝问题也是一个经典问题了。
给你附两个链接学习一下,有出错的案例和详尽的解释: