Python 为预测的群集创建新列:SettingWithCopyWarning

Python 为预测的群集创建新列:SettingWithCopyWarning,python,pandas,scikit-learn,tf-idf,Python,Pandas,Scikit Learn,Tf Idf,不幸的是,这个问题将是重复的,但我无法在代码中解决这个问题,即使在查看了其他类似问题及其相关答案之后。 我需要将我的数据集拆分为训练测试数据集。然而,当我添加一个用于预测集群的新列时,我似乎犯了一些错误。 我得到的错误是: /anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice

不幸的是,这个问题将是重复的,但我无法在代码中解决这个问题,即使在查看了其他类似问题及其相关答案之后。 我需要将我的数据集拆分为训练测试数据集。然而,当我添加一个用于预测集群的新列时,我似乎犯了一些错误。 我得到的错误是:

/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:3: 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
  This is separate from the ipykernel package so we can avoid doing imports until
关于这个错误有一些问题,但可能是我做错了什么,因为我还没有解决这个问题,我仍然会遇到与上面相同的错误。 数据集如下所示:

    Date    Link    Value   
0   03/15/2020  https://www.bbc.com 1
1   03/15/2020  https://www.netflix.com 4   
2   03/15/2020  https://www.google.com 10
...
我已将数据集分为以下训练集和测试集:

import sklearn
from sklearn.model_selection import cross_validate
from sklearn.model_selection import train_test_split
import re
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
import nltk
import string as st 

train_data=df.Link.tolist()
df_train=pd.DataFrame(train_data, columns = ['Review'])
X = df_train

X_train, X_test = train_test_split(
        X, test_size=0.4).copy()
X_test, X_val = train_test_split(
        X_test, test_size=0.5).copy()
print(X_train.isna().sum())
print(X_test.isna().sum())

stop_words = stopwords.words('english')

def preprocessor(t):
    t = re.sub(r"[^a-zA-Z]", " ", t())
    words = word_tokenize(t)
    w_lemm = [WordNetLemmatizer().lemmatize(w) for w in words if w not in stop_words]
    return w_lemm


vect =TfidfVectorizer(tokenizer= preprocessor)
vectorized_text=vect.fit_transform(X_train['Review'])
kmeans =KMeans(n_clusters=3).fit(vectorized_text)
导致错误的代码行有:

cl=kmeans.predict(vectorized_text)
X_train['Cluster']=pd.Series(cl, index=X_train.index)
我认为这两个问题应该能够帮助我编写代码:

但是我的代码中仍然有一些错误


请您看一下,并帮助我在将此问题作为重复问题结束之前解决此问题好吗?

IMHO,
train\u test\u split
给您一个元组,当您执行
copy()
时,
copy()
是一个
元组的操作,而不是熊猫。这引发了熊猫臭名昭著的复制警告

因此,只创建元组的浅层副本,而不创建元素。换句话说

X_train, X_test = train_test_split(X, test_size=0.4).copy()
相当于:

train_test = train_test_split(X, test_size=0.4)
train_test_copy = train_test.copy()
X_train, X_test = train_test_copy[0], train_test_copy[1]
由于数据帧是指针,
X\u train
X\u test
可能指向或可能不指向与
X
相同的数据。如果要复制数据帧,应在每个数据帧上显式强制执行
copy()

X_train, X_test = train_test_split(X, test_size=0.4)
X_train, X_test = X_train.copy(), X_test.copy()

然后,每个
X_列
X_测试
都是指向新内存数据的新数据帧


更新:在没有任何警告的情况下测试此代码:

X = pd.DataFrame(np.random.rand(100,3))
X_train, X_test = train_test_split(X, test_size=0.4)
X_train, X_test = X_train.copy(), X_test.copy()

X_train['abcd'] = 1

请在删除已关闭为重复的问题并逐字重新打开之前,确保您显示链接的答案如何准确地解决您的问题,而不是仅说明“但我的代码中仍有错误”;第一个答案清楚地显示了如何将给出错误的行分为两个步骤,即
cl=kmeans.predict(矢量化文本)
,然后
X\u train['Cluster']=pd.Series(cl,index=X\u train.index)
。你真的试过吗?如果是,但仍然出现错误,请相应地修改此处显示的代码。第一个答案中确实存在问题(应该是
pd.Series
,而不是
Series
);请检查并确认您的问题已使用(编辑的)答案解决。好的,然后,正如我所说的,请修改您的代码以显示这一点(从而证明您的问题不是重复的)。这不是一个错误-这是一个警告。您是否转到警告中建议的链接?任何时候,您都会将数据分配给数据帧的一个片段的副本,您将得到此消息。“这不一定是你代码中的错误,这就是为什么它是一个警告而不是错误。是的,我做了,但我不明白我应该怎么做才能让它消失/修复它。非常感谢你,@Quang Hoang。”。它修正了警告。
X = pd.DataFrame(np.random.rand(100,3))
X_train, X_test = train_test_split(X, test_size=0.4)
X_train, X_test = X_train.copy(), X_test.copy()

X_train['abcd'] = 1