尝试改用 .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的主要内容,如果未能解决你的问题,请参考以下文章
pandas警告:SettingWithCopyWarning