首页 > 解决方案 > 如何安全地解决在 Pandas DataFrame 上分配时带有复制警告的设置

问题描述

我有一个标准的 Pandas 数据框:-

<class 'pandas.core.frame.DataFrame'>

最后一列称为“文本”,每行包含一个文本字符串。我试图通过应用一个用新字符串替换它们的公式来转换最后一列文本值。

但是,无论我做什么,我似乎都会收到以下警告:-

/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:1763:SettingWithCopyWarning:试图在数据帧的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value

请参阅文档中的警告: https: //pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy isetter(loc, value)

在列上分配我的函数会产生上述错误:-

X_train.loc[:,"text"] = X_train.loc[:,"text"].transform(lambda x : a_function(x))

这也会产生错误。

X_train.loc[:,"text"] = X_train.loc[:,"text"].apply(lambda x : a_function(x))

将等式的右侧放入一个变量中,我意识到该部分代码(即等号右侧的代码)没有错误 X_train.loc[:,"text"].apply(lambda x : a_function(x))。所以我知道问题必须与我在数据框顶部分配的方式有关(即等号左侧的代码,X_train.loc[:,"text"]

我尝试在值的顶部分配一个文本字符串:-

X_train.loc[:,'text'] = "a text string"

我也尝试过应用一个包含新文本字符串的新熊猫系列对象

X_train.loc[:,'text'] = a_series

这两个实验都表明问题与试图分配X_train.loc[:,'text']

对我来说,代码似乎.loc[row_indexer,col_indexer] = value采用警告建议的格式似乎特别奇怪。

我在https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy研究了 Pandas 文档。但是,我仍然不清楚如何解决我的错误,尽管我意识到这一定与转换我的数据的浅拷贝的危险有关。

值得注意的是,当我在应用转换后检查数据框时,原始数据已被修改。我仍然收到来自 Pandas 的警告这一事实让我很担心,所以我不觉得只是关闭警告。我宁愿编写不会产生错误的代码,这样我就知道我的代码对抛出的任何新数据都是健壮的,并且不会突然开始修改浅拷贝,同时保持原件不变。

如果我要求太多并且

标签: pythonpandasdataframewarnings

解决方案


推荐阅读