python数据清洗,如何使用df.fillna()来填充缺失数据?
发布于 作者:苏南大叔 来源:程序如此灵动~数据集里面经常有缺失的数据,包括NaN
和None
。怎么改如何对这些缺失的值进行处理呢?可以删除不合理的数据,也可以选择填充上合理的数据。本文采用的方法就是.fillna()
,也就是建立在数据填充的基础上。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8
,pandas@1.1.5
,numpy@1.24.4
。
fillna原型
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
机器学习的时候,原始数据集的处理。就大量涉及缺失值处理的问题,也就是.fillna()
的问题。参数很多,不过都用不到,本文就讲述前两个参数value
和method
。后面的参数,待后续文章补充。
关于不合理的值有很多种,其中缺失值NaN
仅仅是其中的一种。并且本文的.fillna()
所针对的数据,也就是出现在dataframe
里面的NaN
和None
,并不能处理其它的数据。这是本文写作的基本前提。
填充固定值
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
改名的操作,真的很推荐,避免了大小写转化带来的认知上的混淆。
填充集合值
也可以填充一个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)
填充后一个非空值【可能效果不完美】
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
填充中位数
中位数可不是平均数,但是有的时候,两者相等。在下面的代码中,可以仔细体会。
import pandas as pd
import numpy as np
from numpy import nan as NaN
df = pd.DataFrame([[1, 2, 3], [6, 6, 2], [3, NaN, 5], [7, 8, NaN], [NaN, NaN, NaN]])
print(df)
df[0] = df[0].fillna(df[0].median())
df[1] = df[1].fillna(df[1].median())
df[2] = df[2].fillna(df[2].median())
print(df)
输出:
0 1 2
0 1.0 2.0 3.0
1 6.0 6.0 2.0
2 3.0 NaN 5.0
3 7.0 8.0 NaN
4 NaN NaN NaN
0 1 2
0 1.0 2.0 3.0
1 6.0 6.0 2.0
2 3.0 6.0 5.0
3 7.0 8.0 3.0
4 4.5 6.0 3.0
对于中位数来说,如果存在最中间的那个数,那么中位数就是最中间的那个数。如果不存在,那么就是最中间的那两个数相加除以2。所以,结论是:中位数可能是平均数,也可能不是。可能是真实存在的数,也可能不是。平均数的时候,是最中间的两个数的平均数,而不包括收尾。
谁前谁后
axis
默认为0
,改成1
之后,这个前后的标准就变了。虽然能执行成功,但是,从数据集的角度来说,这个数据集似乎就不对的,用了另外一列(比如:age
)的数据填充到本列(比如:name
)。是不是更加混乱了呢?
这个大家有不同意见的话,可以留言给我。
相关文章
关于缺失值NaN
的判断,可以参考文章:
关于如何求解平均数或中位数,可以参考文章:
更多文章
更多python
相关经验文章,请参考苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。