pandas的fillna和replace使用失效解决方案

问题

pandas的dataframe结构体使用fillna的过程中出现错误

有如下的warning:

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

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

解决方案和分析

原因主要来自于当执行replace或者fillna inplace=True的时候,其实通过列名拿到的是一个dataframe的切片的一个copy,并非原dataframe

以下例子更能说明这一点,其实是一回事

752efe437fc3095ed293724e2523ac56.png

如果非要改变原dataframe的值,可以这样解决

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

推荐阅读:

我的2022届互联网校招分享

我的2021总结

浅谈算法岗和开发岗的区别

互联网校招研发薪资汇总

2022届互联网求职现状,金9银10快变成铜9铁10!!

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

44f87dacdb55633b4527f5002d5ea561.jpeg

发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)

发送【1222】获取一份不错的leetcode刷题笔记

发送【AI四大名著】获取四本经典AI电子书

猜你喜欢

转载自blog.csdn.net/qq_33431368/article/details/131820487