我正在运行修改数据框中某个阈值内的值的代码。我收到一条警告,从表面上看似乎没有必要:
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
我的代码已经使用了 a.loc[row,column]
赋值,因此我不明白警告为什么会这样。
import pandas as pd
#pd.options.mode.chained_assignment = None #disable warning
#pd.set_option('mode.chained_assignment','warn')#or "warn" or "raise"
u = (df
# Group all forecasts together
.groupby(by="forecast_id", sort=False)
# modify only forecasts groups that have smallest value = 0
.filter(lambda x: x.value.min() == 0, dropna=False)
# transform values according to a function
.value.transform( lambda x: (x+0.005).where(x == 0, x-0.005) )
)
# replace the column in the dataframe with the new values except those unaffected
df.loc[pd.notnull(u), "value"] = u
我无法解释的另一种行为是,当我使用警告选项时,一旦我将警告设置为None
,即使我将其重置为"warn"
,也不再有警告。注意:我的代码用作函数。
编辑
顶部的链接中提供了代码功能的描述以及示例;但是,我在这里的重点是理解为什么警告会建议已经实现的实现:Pandas - Calculate New Value Based on Cross Reference with another Column