原代码
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不久不太懂,求大佬讲解一下为什么会这样??拜托了
Stringwithcopywarning 这一句并不是报错, 只是一个警告, 程序还是可以运行的.
如果不想预警提示呢, 可以先运行下面这2句
import warnings
warnings.filterwarnings('ignore')
出现这个预警你因为你用着这一句
data1['four']=10
他建议的写法是
df.loc[row_indexer,col_indexer] = value instead
warning是警告,不影响最终结果的。
当你试图对链式索引赋值的时候,就会发生经典的SettingWithCopyWarning问题。
这是Pandas的针对链式赋值(Chained Assignment)的保护机制导致的结果。所谓链式赋值,就是对索引的索引结果赋值。当我们使用条件检索时,相当于一次索引,在对这个结果做loc选取,就是二次索引,也就是链式索引,而链式索引在Pandas体系中被禁止赋值。简单理解,就是我们无法对通过两个方括号选取的数据赋值。
我曾经写过一篇博客,名字就叫《不要对链式索引赋值!趟过了这个坑,才能真正迈入Pandas高手之列》https://xufive.blog.csdn.net/article/details/107763112,题主可以参考一下。