pandas警告:SettingWithCopyWarning
Posted solong1989
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas警告:SettingWithCopyWarning相关的知识,希望对你有一定的参考价值。
在使用pandas对DataFrame进行赋值操作时,会出现一个看似莫名巧妙的告警信息:
SettingWithCopyWarning:A value is trying to be set on a copy of slice from a DataFrame
Try using .loc[row_indexer,col_indexer] = value instead
这条告警信息的大意是,“尝试在DataFrame一个切片的副本上进行赋值,使用 .loc[row_indexer,col_indexer] = value 代替当前赋值操作”。导致这条告警产生的原因,是由于pandas无法判断对原始DataFrame进行切片,产生的是视图还是副本。如果切片产生的是视图,则赋值操作会修改原始DataFrame,如果产生的是副本,则不会修改原始的DataFrame。
一般产生这条告警,都是由于使用链式索引(chained indexing)赋值导致的;而使用 .loc[row_indexer,col_indexer] 则会产生一个新的DataFrame,在某些情况下,可以解决该告警问题(ps:导致 SettingWithCopyWarning 告警产生的情况不止一种!)。如果你选择忽视这条告警,那么你最好查看一下自己的赋值操作有没有成功(虽然本人实际运用中查看了多次,都是成功的,但不代表每一次都能成功,所以建议还是不要忽视这条告警)。
总而言之,应该竟可能的避免使用链式索引对 DataFrame 进行复制操作。具体产生告警的原因及解决方法的详解,可以参考pandas官方文档中的 "Indexing and Selecting Data"模块下的"Returning a view versus a copy" http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy。也可参考我看到一篇写的很好的文章:https://www.dataquest.io/blog/settingwithcopywarning/(英文原文),https://www.jianshu.com/p/72274ccb647a(中文翻译版)。
以上是关于pandas警告:SettingWithCopyWarning的主要内容,如果未能解决你的问题,请参考以下文章
pandas DataFrame 警告(SettingWithCopyWarning)
pandas chained_assignment 警告异常处理