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']))
回答:
不用管它,接着奏乐,接着舞。
这个不是 np.where
的问题,这是 pandas
给出的善意警告,提醒你可能那里有问题(运行正常,然而结果可能不是你想要的),但 pandas
不能确定,毕竟它不清楚你的意图。
编程中许多警告都是可以忽略的(这十分正常),一般只有造成意想不到的问题时,我们才会重视起来。你代码这里的行为是正确的,所以这里可以不管这个警告,如果实在不想看到它,可以设置:
import pandas as pdpd.set_option('mode.chained_assignment', None) # 除非在项目最后阶段(不该打印它给用户看),或认为自己不可能犯错的情况下才加
至于警告的原因,可以学习一下(大部分警告都有学习的必要,以防止自己给自己挖坑)。在这里是由 Pandas 中链式索引(chained indexing)带来的引用(视图,原对象)和拷贝(新对象)的问题,本质上的引用和拷贝问题也是一个经典问题了。
给你附两个链接学习一下,有出错的案例和详尽的解释:
- Returning a view versus a copy
- Explaining the SettingWithCopyWarning in pandas
以上是 pandas np.where 报Settingwithcopy warining 的全部内容, 来源链接: utcz.com/p/938225.html