我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

数据集里面经常有缺失的数据,包括NaNNone。怎么改如何对这些缺失的值进行处理呢?可以删除不合理的数据,也可以选择填充上合理的数据。本文采用的方法就是.fillna(),也就是建立在数据填充的基础上。

苏南大叔:python数据清洗,如何使用df.fillna()来填充缺失数据? - 填充缺失数据
python数据清洗,如何使用df.fillna()来填充缺失数据?(图3-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8pandas@1.1.5numpy@1.24.4

fillna原型

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

机器学习的时候,原始数据集的处理。就大量涉及缺失值处理的问题,也就是.fillna()的问题。参数很多,不过都用不到,本文就讲述前两个参数valuemethod。后面的参数,待后续文章补充。

关于不合理的值有很多种,其中缺失值NaN仅仅是其中的一种。并且本文的.fillna()所针对的数据,也就是出现在dataframe里面的NaNNone,并不能处理其它的数据。这是本文写作的基本前提。

填充固定值

value,可以填充固定的值,

import pandas as pd
from numpy import nan as NaN
df = pd.DataFrame([[NaN, None, '', " ", 0, False]])
print(df)
#     0     1 2  3  4      5
# 0 NaN  None       0  False

df2 = df.fillna("ok")
print(df2)
#     0   1 2  3  4      5
# 0  ok  ok       0  False
这里给nan改名的操作,真的很推荐,避免了大小写转化带来的认知上的混淆。

苏南大叔:python数据清洗,如何使用df.fillna()来填充缺失数据? - 被填充的范围
python数据清洗,如何使用df.fillna()来填充缺失数据?(图3-2)

填充集合值

也可以填充一个dataframe或者series或者set,但是要求对应的索引要相同,效果类似个数组合并的效果。

import pandas as pd
from numpy import nan as NaN
df = pd.DataFrame([[NaN, None, '', " ", 0, False]])
df3 = df.fillna({0: "oo", 1: "kk", 2: "ookk"})
print(df3)
'''
    0   1 2  3  4      5
0  oo  kk       0  False
'''
import pandas as pd
df4 = df.fillna(pd.DataFrame({0: "aa", 1: "bb", 2: "aabb"},index=[0]))
print(df4)
'''
    0   1 2  3  4      5
0  aa  bb       0  False
'''
df5 = df.fillna(pd.Series({0: "bb", 1: "qq", 2: "bbqq"}))
print(df5)
'''
    0   1 2  3  4      5
0  bb  qq       0  False
'''

填充前一个非空值【可能效果不完美】

ffill/pad,前面一个非缺失值作为value

import pandas as pd
import numpy as np
from numpy import nan as NaN
df = pd.DataFrame([[1, 2, 3], [NaN, None, 2], [NaN, NaN , None], [7, 8, NaN]])
print(df)
'''
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  2.0
2  NaN  NaN  NaN
3  7.0  8.0  NaN
'''
d2 = df.fillna(method='ffill')
d3 = df.fillna(method='pad')
'''
     0    1    2
0  1.0  2.0  3.0
1  1.0  2.0  2.0
2  1.0  2.0  2.0
3  7.0  8.0  2.0
'''
print(d2)
print(d3)

苏南大叔:python数据清洗,如何使用df.fillna()来填充缺失数据? - 前后的标准
python数据清洗,如何使用df.fillna()来填充缺失数据?(图3-3)

填充后一个非空值【可能效果不完美】

bfill/backfill,后面一个非缺失值作为value

import pandas as pd
import numpy as np
from numpy import nan as NaN
df = pd.DataFrame([[1, 2, 3], [NaN, None, 2], [NaN, NaN , None], [7, 8, NaN]])
print(df)
'''
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  2.0
2  NaN  NaN  NaN
3  7.0  8.0  NaN
'''
d2 = df.fillna(method='bfill')
d3 = df.fillna(method='backfill')
print(d2)
print(d3)
'''
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  2.0
2  NaN  NaN  NaN
3  7.0  8.0  NaN
     0    1    2
0  1.0  2.0  3.0
1  7.0  8.0  2.0
2  7.0  8.0  NaN
3  7.0  8.0  NaN
'''

填充平均值

在实际的操作中,经常为一个列的NA数据,填充对应列的平均数。比如:

import pandas as pd
import numpy as np
from numpy import nan as NaN
df = pd.DataFrame([[1, 2, 3], [NaN, None, 2], [NaN, NaN , None], [7, 8, NaN]])
print(df)

df[0] = df[0].fillna(df[0].mean())
df[1] = df[1].fillna(df[1].mean())
df[2] = df[2].fillna(df[2].mean())
print(df)

输出:

     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  2.0
2  NaN  NaN  NaN
3  7.0  8.0  NaN

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0  2.0
2  4.0  5.0  2.5
3  7.0  8.0  2.5

谁前谁后

axis默认为0,改成1之后,这个前后的标准就变了。虽然能执行成功,但是,从数据集的角度来说,这个数据集似乎就不对的,用了另外一列(比如:age)的数据填充到本列(比如:name)。是不是更加混乱了呢?

这个大家有不同意见的话,可以留言给我。

相关文章

关于缺失值NaN的判断,可以参考文章:

更多文章

更多python相关经验文章,请参考苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python