Part7:Pandas 的SettingWithCopyWarning 报警复现、原因、解决方案

Pandas 的SettingWithCopyWarning 报警

1、读取数据并对数据进行预处理操作

fpath='./datas/beijing_tianqi/beijing_tianqi_2018.csv'
df=pd.read_csv(fpath)
df.head()
df

import pandas as pd
df.loc[:,'bWendu']=df['bWendu'].str.replace('℃','').astype('int32')
df.loc[:,'yWendu']=df['yWendu'].str.replace('℃','').astype('int32')
df

 

2、复现错误 

只选出3月份的数据用来分析

#只选出3月份的数据用来分析
condition=df['ymd'].str.startswith('2018-03')

设置温差

#设置温差
df[condition]['wen_cha']=df['bWendu']-df['yWendu']

值得注意的是报错: 

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
 发现:df[condition]['wen_cha']=df['bWendu']-df['yWendu']改句代码出错

这里我们也可以查看官网网站去完成差错:Indexing and selecting data — pandas 1.4.4 documentation (pydata.org)

查看是否修改成功

#查看是否修改成功
df[condition].head()

 3、原因

发出警告的代码: df[condition]['wen_cha']=df['bWendu']-df['yWendu']
相当于: df.get(condition).set(wen_cha),第一步的get发出了报警
链式操作其实是两个步骤,先get 后set,get得到的dateframe可能是View也可能是Copy、Pandas发出警告
【先可以去官网查看原因】

核心: pandas的dataframe的修改写操作,只允许在dataframe上进行,一步到位

4、解决方法1

将get+set 的两步操作,改成set的一步操作

df.loc[condition,'wen_cha']=df['bWendu']-df['yWendu']
df.head()
df[condition].head()

 5、解决方法2

如果需要预选筛选数据做后续的处理分析,使用copy复制Dataframe

df_month3=df[condition].copy()
df_month3.head()

df_month3['wen_cha']=df['bWendu']-df['yWendu']
df_month3.head()

 

 

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的学习日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值