尝试改用 .loc[row_indexer,col_indexer] = value

Posted

技术标签:

【中文标题】尝试改用 .loc[row_indexer,col_indexer] = value【英文标题】:Try using .loc[row_indexer,col_indexer] = value instead 【发布时间】:2018-10-06 20:43:41 【问题描述】:

使用python,有问题。

 resource1   #"dataframe"

和,

resource1.loc[(resource1["code"] == ""), "code"] = "nocode"

那么,错误信息就在这里。

~/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py:537: SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = value 而是请参阅文档中的警告: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self.obj[项目] = s

代码有什么问题?

【问题讨论】:

你需要发布你的数据,重现你的df的代码,以及重现你的错误的代码,看看你的代码,为什么你需要在布尔掩码周围使用()?这个工作:resource1.loc[resource1["code"] == "", "code"] = "nocode" 正如@EdChum 所写,您需要展示您是如何生成数据的。查看您的错误消息表明您可能使用切片创建了 resource1,例如:resource1 = resource1.loc[resource1["Code"] == "special_code"] 【参考方案1】:

如果您从其他来源创建了 resource1,例如:

# original DattaFrame
resource = pd.DataFrame('code':['aaa', "", 'bb', 'nbn'])
# new DataFrame 
resource1 = resource[resource['code'].str.len()<3]

您收到警告消息(但 resource1 已被修改)。原因可能是 resource1 是作为来自 resource 的过滤器创建的,并且不清楚它是否返回副本或视图 - 而是对 resources 的引用的新变量(有关更多详细信息,请参阅link)。为避免这种情况,您可以使用 deepcopy 功能

import copy
resource1 = copy.deepcopy(resource[resource['code'].str.len()<3])

这会使用过滤后的数据和您的代码安全地创建全新的 DataFrame

resource1.loc[(resource1["code"] == ""), "code"] = "nocode"

将在没有警告的情况下工作。

或者您可以禁用链式分配以达到相同的效果(但警告不仅令人讨厌,因此请仔细考虑该选项...)

pandas.options.mode.chained_assignment = None

【讨论】:

以上是关于尝试改用 .loc[row_indexer,col_indexer] = value的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框列计算

试图在 DataFrame 中的切片副本上设置一个值

Python 视图与复制错误希望我仅在脚本中使用 .loc

pandas警告:SettingWithCopyWarning

[问题解决]pandas DataFrame中经常出现SettingWithCopyWarning

pandas DataFrame 警告(SettingWithCopyWarning)