Python 即使在使用.loc之后,仍试图在数据帧警告的切片副本上设置值

Python 即使在使用.loc之后,仍试图在数据帧警告的切片副本上设置值,python,pandas,Python,Pandas,我得到一个警告” 尽管如文件建议,我使用的是df.loc def sentenceInReview(df): tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') print "size of df: " + str(df.size) df.loc[: ,'review_text'] = df.review_text.map(lambda x: tokenizer.tokenize(x)) p

我得到一个警告”

尽管如文件建议,我使用的是df.loc

def sentenceInReview(df):
    tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
    print "size of df: " + str(df.size)
    df.loc[: ,'review_text'] = df.review_text.map(lambda x: tokenizer.tokenize(x))

    print df[:3]

我在今天早些时候遇到了这个问题,这个问题与Python在函数之间传递“对象引用”的方式有关/分配变量等

与python中的(比如R)不同,在python中,将现有数据帧分配给新变量不会产生副本,因此对“新”数据帧的任何操作仍然是对原始底层数据的引用

解决这一问题的方法是,每当您试图返回某个内容的副本时,制作一个深度副本()。请参阅:

import pandas as pd
data = [1, 2, 3, 4, 5]
df = pd.DataFrame(data, columns = {'num'})
dfh = df.head(3)  # This assignment doesn't actually make a copy
dfh.loc[:,'num'] = dfh['num'].apply(lambda x: x + 1)
# This will throw you the error

# Use deepcopy function provided in the default package 'copy' 
import copy
df_copy = copy.deepcopy(df.head(3))
df_copy.loc[:,'num'] = df_copy['num'].apply(lambda x: x + 1)
# Making a deep copy breaks the reference to the original df. Hence, no more errors.

下面是一个例子,可以解释Python如何做得更好。

警告消息“试图在数据帧中的切片副本上设置值”的常见原因是:切片覆盖另一个切片! 例如:

dfA=dfB['x','y','z']
dfC=dfA['x','z']
“”“ 对于上述代码,您可能会得到这样一条消息,因为dfC是dfA的一部分,而dfA是dfB的一部分。也就是说,dfC是另一个切片dfA之上的切片,两者都链接到dfB。在这种情况下,无论您使用.copy()还是deepcopy或其他类似的方法,都不起作用:-( “”“

解决方案:
希望上面的解释能有所帮助:-)尝试使用pd.Series(数据,index=index\u列表)插入值

@AndyHayden No即使使用apply而不是MAPI,它也会给我同样的警告如果您使用新创建的数据帧调用函数,它还会发出警告吗?df进入该方法后可能已经是“数据帧切片的副本”。是的,新创建的数据帧不会给我警告谢谢解释ion.它帮助我理解了一个类似的问题…熊猫警告没有那么大帮助…谢谢,它对我有用!!
pd.DataFrame
有自己的
copy()
方法,因此不需要为此导入
deepcopy
。@zslim奇怪的是,即使在使用df.copy()之后,我也出现了错误方法。我没有尝试过deepcopy,但它在这里可能仍然会起作用。不过,通常情况下,df.copy()应该足够了。
dfA=dfB['x','y','z']
dfC=dfA['x','z']
dfA=dfB['x','y','z']
dfC=dfB['x','z']