Я использую код, который изменяет значения в пределах определенного порога в кадре данных. Я получаю предупреждение, что на поверхности не кажется оправданным:
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
Мой код уже использует присвоение .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"
, предупреждение больше не появляется. Примечание: мой код используется как функция.
Редактировать
Описание того, что делает код, а также пример, приведено в ссылке вверху; Тем не менее, мое внимание здесь сосредоточено на понимании того, почему в предупреждении предлагается реализация, которая уже реализована: Панды - вычисление нового значения на основе перекрестной ссылки с другим столбцом