fillna函数:

作用:补充缺失值

参数:fillna(inplace,method,limit,axis)

参数解释+代码演示


自定义DataFrame类型的数据

>>> import pandas as pd
>>> import numpy as np
>>> from numpy import nan as NaN
>>> df = pd.DataFrame([[1,2,3],[NaN,NaN,3],[NaN,NaN,NaN]])
>>> df
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  3.0
2  NaN  NaN  NaN

一、不指定任何参数的情况下进行缺失值填充

# 用常数填充

>>> df.fillna(100)
       0      1      2
0    1.0    2.0    3.0
1  100.0  100.0    3.0
2  100.0  100.0  100.0
>>> df
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  3.0
2  NaN  NaN  NaN

# 用字典填充
>>> df.fillna({0:1,1:2,2:3})
     0    1    2
0  1.0  2.0  3.0
1  1.0  2.0  3.0
2  1.0  2.0  3.0
>>> df
     0    1    2
0  1.0  2.0  3.0
1  NaN  NaN  3.0
2  NaN  NaN  NaN

# 可以看到在不指定任何参数的情况下进行缺失值填充,原对象df并没有发生改变

二、指定参数的情况下进行缺失值填充

1、inplace参数的取值:True、False

       True:直接修改原对象

       Fasle:创建一个副本,修改副本,原对象不变(缺失默认

# 指定inplace参数
>>> df.fillna(0,inplace=True) # df对象发生改变
>>> df
     0    1    2
0  1.0  2.0  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0

2、method参数的取值:{'pad','ffill','backfill','bfill','None'}

       pad/ffill:用前一个非缺失值去填充该缺失值

       backfill/bfill:用下一个非缺失值填充该缺失值

       None:指定一个值去替换缺失值(缺失默认)

# 指定method参数
>>> df.iloc[1,1] = NaN
>>> df
     0    1    2
0  1.0  2.0  3.0
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(method='ffill') # 用前一个非缺失值填充该缺失值
     0    1    2
0  1.0  2.0  3.0
1  0.0  2.0  3.0
2  0.0  0.0  0.0
>>> df.iloc[1,1] = NaN
>>> df
     0    1    2
0  1.0  2.0  3.0
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(method='bfill') # 用下一个非缺失值填充该对象
     0    1    2
0  1.0  2.0  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0

3、limit参数:限制填充个数

# 指定limit参数
>>> df.iloc[1,1] = NaN
>>> df.iloc[0,1] = NaN
>>> df
     0    1    2
0  1.0  NaN  3.0
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(method='bfill',limit=1) # 用下一个非缺失值填充,只能填充一个
     0    1    2
0  1.0  NaN  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0

4、axis参数:修改填充方向

       1:按行填充;0:按列填充

# 指定axis参数,注意必须至少和value或method一块使用
>>> df
     0    1    2
0  1.0  NaN  3.0
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(2,axis=1)
     0    1    2
0  1.0  2.0  3.0
1  0.0  2.0  3.0
2  0.0  0.0  0.0
>>> df.fillna(2,axis=0)
     0    1    2
0  1.0  2.0  3.0
1  0.0  2.0  3.0
2  0.0  0.0  0.0
>>> df.iloc[0,2] = NaN
>>> df
     0    1    2
0  1.0  NaN  NaN
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(2,axis=1)
     0    1    2
0  1.0  2.0  2.0
1  0.0  2.0  3.0
2  0.0  0.0  0.0
>>> df.fillna(2,axis=0)
     0    1    2
0  1.0  2.0  2.0
1  0.0  2.0  3.0
2  0.0  0.0  0.0
# 和value一块使用时,效果上看不出来区别

# 和method一块使用时,效果如下
>>> df
     0    1    2
0  1.0  NaN  NaN
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(axis=0,method='bfill') # 按列填充,使用下一行非缺失值填充
     0    1    2
0  1.0  0.0  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0
>>> df
     0    1    2
0  1.0  NaN  NaN
1  0.0  NaN  3.0
2  0.0  0.0  0.0
>>> df.fillna(axis=1,method='bfill') # 按行填充,用下一列非缺失值填充
     0    1    2
0  1.0  NaN  NaN
1  0.0  3.0  3.0
2  0.0  0.0  0.0

# 联合limit表示每行或每列限制填充的个数
>>> df.iloc[0,2] = 3
>>> df
     0    1    2
0  1.0  NaN  3.0
1  0.0  NaN  3.0
2  0.0  0.0  0.0

# 按行填充,每行填充一个,用前一列非缺失值填充
>>> df.fillna(method='ffill',limit=1,axis=1) 
     0    1    2
0  1.0  1.0  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0
# 按列填充,每列填充一个,用前一列非缺失值填充,前一行无,所以未改变
>>> df.fillna(method='ffill',limit=1,axis=0)
     0    1    2
0  1.0  NaN  3.0
1  0.0  NaN  3.0
2  0.0  0.0  0.0
# 按列填充,用下一行非缺失值填充,总共一列缺失,两个缺失值,limit=1限制只能填充一个
>>> df.fillna(method='bfill',limit=1,axis=0)
     0    1    2
0  1.0  NaN  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0
>>> df.iloc[0,2] = NaN
>>> df
     0    1    2
0  1.0  NaN  NaN
1  0.0  NaN  3.0
2  0.0  0.0  0.0
# 按列填充,每列填充一个,用后一行非缺失值填充
>>> df.fillna(method='bfill',limit=1,axis=0)
     0    1    2
0  1.0  NaN  3.0
1  0.0  0.0  3.0
2  0.0  0.0  0.0
'''
 从上面的代码演示中可以看到一块使用axis,method,limit参数时,
limit限制的是每行或每列(axis=1或axis=0)可以填充的个数,
method表示使用前一列/后一列或前一行或后一行非缺失值来填充缺失值
'''

总结:

在机器学习中,当数据有缺失时,如果直接删除某行或某列的数据一般是不可取的,特别当数据量偏小的时候,一般用前一个或下一个非缺失值填充缺失值,或使用均值填充缺失值,填充的语句和参数解释可参考上面的代码理解。

欢迎交流~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐