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']))

pandas np.where 报Settingwithcopy warining
pandas np.where 报Settingwithcopy warining


回答:

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

这个不是 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

以上是 pandas np.where 报Settingwithcopy warining 的全部内容, 来源链接: utcz.com/p/938225.html

回到顶部