路明非的小跟班
2021-03-24 14:39
采纳率: 50%
浏览 53
已采纳

python中pandas发生Stringwithcopywarning

原代码

import numpy as np
import pandas as pd
data=[[1,2,3],[4,5,6],[7,8,9]]
dataframe=pd.DataFrame(data,index=['a','b','c'],columns=['one','two','three'])
print(dataframe)#创建数据对象
x=dataframe['two']>2#筛选第1列(存在第0列概念情况下)中值大于2的所有行数据
data1=dataframe.loc[x]
print(data1)
data1['four']=10
print(data1)#为data1添加一列数据,列索引为‘four’,值都为10
data1[data1>=9]=8#将data1中大于九的数据修改为8
print(data1)

然后会发生Stringwithcopywarning错误

经过修改后现代码

import numpy as np
import pandas as pd
data=[[1,2,3],[4,5,6],[7,8,9]]
dataframe=pd.DataFrame(data,index=['a','b','c'],columns=['one','two','three'])
print(dataframe)#创建数据对象
x=dataframe['two']>2,['one','two','three']#筛选第1列(存在第0列概念情况下)中值大于2的所有行数据
data1=dataframe.loc[x]
print(data1)
data1['four']=10
print(data1)#为data1添加一列数据,列索引为‘four’,值都为10
data1[data1>=9]=8#将data1中大于九的数据修改为8
print(data1)

在发生错误后我努力修改最后发现在筛选大于2的时候在x=dataframe['two']>2后面加上['one','two','three']也就是列之后错误消失,刚学python不久不太懂,求大佬讲解一下为什么会这样??拜托了

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 已采纳

    Stringwithcopywarning  这一句并不是报错, 只是一个警告, 程序还是可以运行的. 

    如果不想预警提示呢, 可以先运行下面这2句

    import warnings
    warnings.filterwarnings('ignore')

    出现这个预警你因为你用着这一句

    data1['four']=10

    他建议的写法是

    df.loc[row_indexer,col_indexer] = value instead

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • herosunly 2021-03-24 14:43

    warning是警告,不影响最终结果的。

    评论
    解决 1 无用
    打赏 举报
  • 天元浪子 2021-03-24 14:55

    当你试图对链式索引赋值的时候,就会发生经典的SettingWithCopyWarning问题。

    这是Pandas的针对链式赋值(Chained Assignment)的保护机制导致的结果。所谓链式赋值,就是对索引的索引结果赋值。当我们使用条件检索时,相当于一次索引,在对这个结果做loc选取,就是二次索引,也就是链式索引,而链式索引在Pandas体系中被禁止赋值。简单理解,就是我们无法对通过两个方括号选取的数据赋值。

    我曾经写过一篇博客,名字就叫《不要对链式索引赋值!趟过了这个坑,才能真正迈入Pandas高手之列》https://xufive.blog.csdn.net/article/details/107763112,题主可以参考一下。

    评论
    解决 1 无用
    打赏 举报

相关推荐 更多相似问题