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

时间:2018-04-26 08:16:41

标签: python pandas row indexer loc

使用python,有些不对劲。

 resource1   #"dataframe"

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

然后,错误信息就在这里。

  

〜/ anaconda3 / LIB / python3.6 /站点包/大熊猫/核心/ indexing.py:537:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   值而不是请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   self.obj [item] = s

代码有什么问题?

1 个答案:

答案 0 :(得分:0)

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

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

您收到警告消息(但 resource1 已被修改)。原因可能是 resource1 是作为 resource 的过滤器创建的,目前尚不清楚它是否返回copy或view-引用了 resources 的新变量(有关更多详细信息,请参见此mypy)。为了避免这种情况,您可以使用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