0

我正在学习使用管道并制作了一个非常简单的管道,其中FunctionTransformer添加了一个新列、一个ordinal encoder和一个LinearRegression模型。

但事实证明,SettingwithCopy当我运行管道并将问题隔离到FunctionTransformer.

这是代码,我省略了所有不必要的代码(如管道中的序数编码器和回归器) -

def weekfunc(df):
    df['date'] = pd.to_datetime(df.loc[:,'date'])
    df['weekend'] = df.loc[:, 'date'].dt.weekday
    df['weekend'].replace(range(5), 0, inplace = True)
    df['weekend'].replace([5,6], 1, inplace = True)
    return df

get_weekend = FunctionTransformer(weekfunc)

pipe = Pipeline([
    ('weekend transform', get_weekend),
])

pipe.transform(X_train)

这给了我以下错误-

/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:12: 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
  if sys.path[0] == '':
/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:13: 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
  del sys.path[0]
/opt/conda/lib/python3.7/site-packages/pandas/core/generic.py:6619: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  return self._update_inplace(result)

这很奇怪,因为我可以在没有 FunctionTransformer 的情况下做同样的事情而不会出现错误。

我真的很困惑在这里,所以任何帮助表示赞赏

4

1 回答 1

0

这是警告您,您可能未必已完成您需要做的事情。您正在尝试访问和更新视图。尽管视图已更新,但您可能不一定已更新原始 df。这就是问题所在。

Pandas 会警告您,因为可能会出现大错误,尤其是在您处理大型数据集时。

让我们演示一下;

df=pd.DataFrame({'city':['San Fransisco', 'Nairobi'], 'score':[123,95]})

如果城市是内罗毕,让子集并加 2 得分

df['score']=df.loc[df['city']=='Nairobi','score']+2

结果

     city  score
0  San Fransisco    NaN
1        Nairobi   97.0

你意识到虽然它奏效了,但结果却使旧金山无效。这就是警告的全部内容

正确的方法是什么?正确的方法是屏蔽不需要更新的内容。执行此操作的一种方法是警告所推荐的方法。使用 lo 访问器选择要更新的单元格。

df.loc[df['city']=='Nairobi','score']=df.loc[df['city']=='Nairobi','score']+2

结果

    city          score
0  San Fransisco    123
1        Nairobi     97
于 2022-01-03T06:20:15.133 回答