即使在使用.loc之后,也会尝试在DataFrame警告的片的副本上设置值

时间:2015-04-27 06:07:49

标签: python pandas

我收到警告"

 C:\Python27\lib\site-packages\pandas\core\indexing.py:411: 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 the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s" 

虽然我在文档中建议使用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]

3 个答案:

答案 0 :(得分:1)

警告消息“试图在来自DataFrame的切片的副本上设置值”的常见原因:切片在另一个切片上! 例如:

dfA=dfB['x','y','z']
dfC=dfA['x','z']

“”“ 对于上述代码,由于dfC是dfA的一部分,而dfA是dfB的一部分,则可能会收到这样的消息。 aka dfC是另一个切片dfA上的一个切片,并且两者都链接到dfB。在这种情况下,无论您使用.copy()还是deepcopy或其他类似方式均不起作用:-( “”“

解决方案:

dfA=dfB['x','y','z']
dfC=dfB['x','z']

希望以上说明对您有帮助:-)

答案 1 :(得分:0)

我今天早些时候遇到过这个问题,这个问题与Python传递的方式有关,对象引用'在函数/赋值变量等之间。

与py不同,R在python中将现有数据帧分配给新变量并不进行复制,因此对“' new' dataframe仍然是对原始基础数据的引用。

解决这个问题的方法是在您尝试返回某个内容的副本时进行深层复制(see docs)。参见:

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.

这里有一个bit more on this topic,可以解释Python做得更好的方式。

答案 2 :(得分:0)

尝试使用pd.Series(data,index = index_list)插入值