zoukankan      html  css  js  c++  java
  • pandas DataFrame 警告(SettingWithCopyWarning)

    转自:https://www.cnblogs.com/pig-fly/p/7875472.html

    刚接触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被更改时一同被改掉。总之我现在还只是知其然,不知其所以然,希望有大神帮忙解惑。

  • 相关阅读:
    973. K Closest Points to Origin
    919. Complete Binary Tree Inserter
    993. Cousins in Binary Tree
    20. Valid Parentheses
    141. Linked List Cycle
    912. Sort an Array
    各种排序方法总结
    509. Fibonacci Number
    374. Guess Number Higher or Lower
    238. Product of Array Except Self java solutions
  • 原文地址:https://www.cnblogs.com/eternal1025/p/10492867.html
Copyright © 2011-2022 走看看