使用函数时避免 SettingWithCopyWarning

avoid SettingWithCopyWarning when using a function

提问人:Nicola Lepetit 提问时间:10/6/2022 更新时间:10/6/2022 访问量:220

问:

我有 DataFrame,我需要根据现有列的值派生一个新列。

class SomeClass:
  def reduce(self, x):
    if x < 1:
        return x ** 2
    return np.sqrt(x)    


  def penalize_performance(self, df):
    df['sqrt'] = df.apply(lambda x : self.reduce(x.perf), axis=1)
    return df

结果是正确的,但我收到 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

如何修复语法,以避免该问题?

python pandas lambda 警告 pandas-settingwithcopy-warning

评论

0赞 Ben.T 10/6/2022
问题出在你传递给函数的 df 上,而不是你的类本身。如何定义此数据帧?例如,它是否是较大 DataFrame 的子部分?

答:

1赞 Echo 10/6/2022 #1

我发现避免的最好方法(这基本上是警告您检查结果,因为方法链接可能无法按预期工作,这意味着它只能更新您的 DataFrame“原始 DatFrame 副本”的子集,而不是您的原始 DataFrame)SettingWithCopyWarning

是使用.loc[]

class SomeClass:
  def reduce(self, x):
    if x < 1:
        return x ** 2
    return np.sqrt(x)    


  def penalize_performance(self, df):
    df.loc[:, 'sqrt'] = df.apply(lambda x : self.reduce(x.perf), axis=1) #Edited line using .loc[] to update a dataframe.
    return df