问题
pandas的dataframe结构体使用fillna的过程中出现错误
有如下的warning:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
![c540305e63d8d9b12ade00d257da1cbd.png](https://img-blog.csdnimg.cn/img_convert/c540305e63d8d9b12ade00d257da1cbd.png)
我的使用类似于以下这个例子:
import pandas as pd
import numpy as np
df = pd.DataFrame({'woniu':[-np.inf,2,3,np.nan],
'che':['22',np.nan, '33', 'wn'],
'ccc':[99,np.nan, 6, np.inf]})
print(df)
print(df.isnull().sum())
df[['woniu', 'che']].replace([np.inf, -np.inf], np.nan, inplace=True)
df[['woniu', 'che']].fillna(value=0, inplace=True)
接下来使用df[['woniu', 'che']]
![3e41b150587229a882fb634c2ae37bdf.png](https://img-blog.csdnimg.cn/img_convert/3e41b150587229a882fb634c2ae37bdf.png)
解决方案和分析
原因主要来自于当执行replace或者fillna inplace=True的时候,其实通过列名拿到的是一个dataframe的切片的一个copy,并非原dataframe
以下例子更能说明这一点,其实是一回事
![752efe437fc3095ed293724e2523ac56.png](https://img-blog.csdnimg.cn/img_convert/752efe437fc3095ed293724e2523ac56.png)
如果非要改变原dataframe的值,可以这样解决
![7dfa71c1f3bf5de9d1c32d9e4e0a3a0b.png](https://img-blog.csdnimg.cn/img_convert/7dfa71c1f3bf5de9d1c32d9e4e0a3a0b.png)
df.loc[:, ['woniu', 'che']] = df.loc[:, ['woniu', 'che']].replace([np.inf, -np.inf], np.nan)
df.loc[:, ['woniu', 'che']] = df.loc[:, ['woniu', 'che']].fillna(0)
如果不想改变原dataframe的数据,只是想改变切片的值,那就直接把切片取出来操作
df_frame = df[['woniu', 'che']]
df_frame.replace([np.inf, -np.inf], np.nan, inplace=True)
df_frame.fillna(0, inplace=True)
之后用df_frame
推荐阅读:
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记
发送【AI四大名著】获取四本经典AI电子书