pandas DataFrame 警告(SettingWithCopyWarning)

刚接触python不久,编程也是三脚猫,所以对常用的这几个工具还没有一个好的使用习惯,毕竟程序语言是头顺毛驴。所以最近在工作中使用的时候在使用pandas的DataFrame时遇到了以下报警:

SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

debug了半天,也在网上找了很多,还是没有解决,在报警的那一句调了半天,后来发现主要问题并不是出现在报警的那一句。

给个例子复现一下这个问题:

1 import pandas as pd
2 A = pd.DataFrame([[1,2,3],[2,3,4],[3,4,5]], columns = [‘a‘,‘b‘,‘c‘])
3 B = A[[‘a‘, ‘b‘]]
4 B[‘a‘] = B[‘a‘] + 1 # same result by using B.loc[:,‘a‘] = B.loc[:,‘a‘]+ 1

输出:

A
Out[1]:
   a  b  c
0  1  2  3
1  2  3  4
2  3  4  5

B
Out[2]:
   a  b
0  1  2
1  2  3
2  3  4

B
Out[3]:
   a  b
0  2  2
1  3  3
2  4  4

先说一下我的感觉:这个报警主要是说,你当前对B的操作可能会改变另一个DataFrame A,所以你要小心了。(当然实际的警告并不是这个意思,但是“在DataFrame的一个切片的copy上进行操作”我感觉不出来有什么问题,还请大神们解答一下。)

报警出现在第4行,但主要的问题在于第3行:应该使用.loc方法得到新的DataFrame,而不是直接使用[]引用。

C = A.loc[:,[‘a‘,‘b‘]]
C[‘a‘] = C[‘a‘]+1

这样就不会出现报警了。

个人感觉好像是说用.loc是对原有DataFrame的一种复制性引用,而[]的引用则是指针性的引用,和python本身的赋值特性有关。不过我看了A的值也并没有在B被更改时一同被改掉。总之我现在还只是知其然,不知其所以然,希望有大神帮忙解惑。

时间: 2024-10-14 19:28:05

pandas DataFrame 警告(SettingWithCopyWarning)的相关文章

pandas.DataFrame.plot

pandas.DataFrame.plot¶ DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, sharex=None, sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None, legend=True, style=None, logx=False, logy=False, loglog=False, xt

pandas.DataFrame学习系列2——函数方法(1)

DataFrame类具有很多方法,下面做用法的介绍和举例. pandas.DataFrame学习系列2--函数方法(1) 1.abs(),返回DataFrame每个数值的绝对值,前提是所有元素均为数值型 1 import pandas as pd 2 import numpy as np 3 4 df=pd.read_excel('南京银行.xlsx',index_col='Date') 5 df1=df[:5] 6 df1.iat[0,1]=-df1.iat[0,1] 7 df1 8 Open

pandas.DataFrame学习系列1——定义及属性

定义: DataFrame是二维的.大小可变的.成分混合的.具有标签化坐标轴(行和列)的表数据结构.基于行和列标签进行计算.可以被看作是为序列对象(Series)提供的类似字典的一个容器,是pandas中主要的数据结构. 形式: class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False) 参数含义: data : numpy ndarray(多维数组)(结构化或同质化的), dict(字典

Python pandas.DataFrame调整列顺序及修改index名

1. 从字典创建DataFrame >>> import pandas >>> dict_a = {'user_id':['webbang','webbang','webbang'],'book_id':['3713327','4074636','26873486'],'rating':['4','4','4'],'mark_date':['2017-03-07','2017-03-07','2017-03-07']} >>> df = pandas.

Python Pandas -- DataFrame

pandas.DataFrame class pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)[source] Two-dimensional size-mutable, potentially heterogeneous tabular data structure with labeled axes (rows and columns). Arithmetic operations al

pandas DataFrame(1)

之前介绍了numpy的二维数组,但是numpy二维数组有一些局限性,比如,它数组里所有的值的类型必须相同,不能某一列是数值型,某一列是字符串型,这样会导致无法使用 mean() , std() 等方法去计算某一行或某一列. 但是,使用pandas DataFrame可以解决这一问题. pandas DataFrame也是二维数据,和pandas Series一样, pandas DataFrame也有'索引'这个概念,它每一列都有一个索引值: import pandas as pd df = p

pandas DataFrame(2)-行列索引及值的获取

pandas DataFrame是二维的,所以,它既有列索引,又有行索引 上一篇里只介绍了列索引: import pandas as pd df = pd.DataFrame({'A': [0, 1, 2], 'B': [3, 4, 5]}) print df # 结果: A B 0 0 3 1 1 4 2 2 5 行索引自动生成了 0,1,2 如果要自己指定行索引和列索引,可以使用 index 和 column 参数: 这个数据是5个车站10天内的客流数据: ridership_df = pd

数据分析--pandas DataFrame

pandas DataFrame是一个表格类型的数据,含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值).DataFrame即有行索引,也有列索引,可以看作由Series组成的字典(公用同一个索引). DataFrame是以一个或者多个二维块存放的(而不是列表,字典或别的一维数据结构) 构建DataFrame 传入一个等长列表或Numpy数组组成的字典 DataFrame会自动加上索引,且全部列会被有序排列 可以指定序列的排序 传入的列在数据中找不到,会产生Na值 从DataFra

pandas.DataFrame对行和列求和及添加新行和列

pandas.DataFrame对行和列求和及添加新行和列 导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFrame(np.random.randn(4, 5), columns=['A', 'B', 'C', 'D', 'E']) DataFrame数据预览: A B C D E 0 0.673092 0.230338 -0.171681 0.31