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

swa*_*oji 12 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" 
Run Code Online (Sandbox Code Playgroud)

虽然按照文档中的建议,我正在使用 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]
Run Code Online (Sandbox Code Playgroud)

Spc*_*ond 14

我今天早些时候遇到了这个问题,这个问题与 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.
Run Code Online (Sandbox Code Playgroud)

这里有更多关于这个主题的内容,可以解释 Python 做得更好的方式。

  • `pd.DataFrame` 有自己的 `copy()` 方法,因此不需要为此导入 `deepcopy` 。 (2认同)

小智 10

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

dfA=dfB['x','y','z']
dfC=dfA['x','z']
Run Code Online (Sandbox Code Playgroud)

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

解决方案:

dfA=dfB['x','y','z']
dfC=dfB['x','z']
Run Code Online (Sandbox Code Playgroud)

希望以上解释有帮助:-)