您的位置: 网站首页> Pandas教程> 当前文章

SettingWithCopyWarning: value is trying to be set on a copy of a slice

老董-我爱我家房产SEO2020-10-05188围观,134赞

  pandas在使用过程中会遇见这个错误: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/user_guide/indexing.html#returning-a-view-versus-a-copy。这个错误在赋值一列的时候出现频率比较高。原因安在呢?

  本节课我们先感受下这个错误,然后分析这个错误的原因,最后再找出解决办法。

  1、复现错误

# -*- coding: utf-8 -*-
import pandas as pd

df = pd.read_excel('test.xlsx')
print(df)
print('------------------')

# 对温度>20的算一下温差
res = df['高温'] > 20
df[res]['温差'] = df['高温'] - df['低温']
print(df)
   城市  高温  低温
0  北京  28  10
1  上海  25   7
2  广州  16   5
3  深圳  17  10
------------------
D:/pyscript/py3script/python66/test2/test.py:8: 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/user_guide/indexing.html#returning-a-view-versus-a-copy
  df[res]['温差'] = df['高温'] - df['低温']
   城市  高温  低温
0  北京  28  10
1  上海  25   7
2  广州  16   5
3  深圳  17  10

  2、错误分析

  上述的操作其实是2个步骤,先从df选择一部分,然后再对其修改。但是pandas无法确定你要在原始df基础上操作还是要复制一个子df出来单独操作,所以才会报这个错!

  3、解决方法(2种,1种是loc选择器,另1种是copy函数)

# -*- coding: utf-8 -*-
import pandas as pd

df = pd.read_excel('test.xlsx')
print(df)
print('------------------')

# 对温度>20的算一下温差
res = df['高温'] > 20
df.loc[res,'温差'] = df['高温'] - df['低温']
print(df)
   城市  高温  低温
0  北京  28  10
1  上海  25   7
2  广州  16   5
3  深圳  17  10
------------------
   城市  高温  低温    温差
0  北京  28  10  18.0
1  上海  25   7  18.0
2  广州  16   5   NaN
3  深圳  17  10   NaN

# -*- coding: utf-8 -*-
import pandas as pd

df = pd.read_excel('test.xlsx')
print(df)
print('------------------')

# 对温度>20的算一下温差
res = df['高温'] > 20
df2 = df[res].copy() #赋值一个子df
df2['温差'] = df['高温'] - df['低温']
print(df2)
   城市  高温  低温
0  北京  28  10
1  上海  25   7
2  广州  16   5
3  深圳  17  10
------------------
   城市  高温  低温  温差
0  北京  28  10  18
1  上海  25   7  18
城市    object
高温     int64
低温     int64
dtype: object

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    SettingWithCopyWarning: value is trying to be set on a copy of a slice文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200