python

当前位置:首页 > Pandas教程 > 当前文章

Pandas教程

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

2020-06-27 170赞 python中国网
每篇文章努力于解决一个问题!

  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、错误分析

  必须明确一点:改写操作只允许在原dataframe的基础上一步到位。上述的错误操作其实是2个步骤,先get再set,而get的操作时pandas无法确定你要在原始df基础上复制一个子df出来,还是截取一部分df。

  3、解决方法(2种)

# -*- 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


文章评论

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