数据预处理|数据清洗|使用Pandas进行缺失值清洗
作者:YXN-python 阅读量:79 发布日期:2023-03-25
数据预处理--缺失值清洗
- 缺失值处理方法: 1) 删除法 2) 替换法 3) 插补法
- Pandas 使用浮点值 NaN 表示缺失数据,以下介绍 pandas 处理缺失值的常用的操作:
1. 缺失值的检测与统计
使用pandas的DataFrame对象类。
- isnull()(或notnull())方法可以直接判断该列中的哪个数据为NaN,缺失值时为True(或False),非缺失值时为False(或True)。
- info() 方法查看非缺失值的信息
- isnull().sum() 方法统计出各列缺失值的数量。
代码示例如下:
import numpy as np
import pandas as pd
df=pd.DataFrame(
[['1','张秀',21,'团员',np.NaN,np.NaN],
['2','李峰',20,np.NaN,'信息系','贵州'],
['3','王元',22,np.NaN,'计算机系',np.NaN]],
columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df)
#打印出各列数据的非缺失值信息
print(df.info())
#打印出缺失值信息,缺失值时为True,非缺失值时为False
print(df.isnull())
#打印出各列中缺失值的数量
print(df.isnull().sum())
2. 删除缺失值
根据一定的规则将含有缺失值的行或列直接进行删除。dropna() 为Pandas库中DataFrame的一个方法,用于删除缺失值。常用形式如下:
dropna(axis=0, how='any', thresh=None, subset=None, ,inplace=False)
import numpy as np
import pandas as pd
df=pd.DataFrame(
[['1','张秀',21,'团员',np.NaN,np.NaN],
['2','李峰',20,np.NaN,'信息系','贵州'],
['3','王元',22,np.NaN,'计算机系',np.NaN]],
columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
#删除含有缺失值的行
print("删除含有缺失值的行:\n",df.dropna())
#删除含有缺失值的列
print("删除含有缺失值的列:\n",df.dropna(axis=1))
#保留至少具有5个非NaN值的行
print("保留至少具有5个非NaN值的行:\n",df.dropna(thresh=5))
#保留至少具有3个非NaN值的列
print("保留至少具有3个非NaN值的列:\n",
df.dropna(thresh=3,axis=1))
3. 填充缺失值
缺失值所在的属性为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;
缺失值所在属性为类别型数据时,则可以选择众数来填充。
Pandas 库中提供了缺失值替换的方法 fillna() ,常用形式如下:
fillna(value=None,method=None,asxi=None,inplace=False,limit=None)
常见的填充方法有:
1. 填充固定值:选取某个固定值/默认值填充缺失值。
2. 填充均值:对每一列的缺失值,填充当前列的均值。
3. 填充中位数:对每一列的缺失值,填充当前列的中位数。
4. 填充众数:对每一列的缺失值,填充当前列的众数。如果存在某列缺失值过多,众数为NaN的情况,这时就取每列删除掉NaN值后的众数。
5. 填充上下样本的数据:对每一数据样本的缺失值,填充其上面一个或下面一个样本的数据值。
6. 填充插值得到的数据:用插值法拟合出缺失的数据,然后进行填充。常用interpolate()函数默认采用线性插值,即假设函数是直线形式,缺失值用前一个值和后一个值的平均数填充。
7. 填充KNN数据:填充近邻的数据,先利用KNN计算临近的k个数据,然后填充它们的均值。
8. 填充模型预测的值:把缺失值作为新的Label,建立模型得到预测值,然后进行填充。
import numpy as np
import pandas as pd
df=pd.DataFrame(
[['1','张秀',21,'团员',np.NaN,np.NaN],
['2','李峰',np.NaN,np.NaN,'信息系','贵州'],
['3','赵峰',np.NaN,np.NaN,'信息系','贵州'],
['4','王元',24,np.NaN,'计算机系',np.NaN]],
columns=['学号','姓名','年龄','政治面貌','系部','籍贯'])
print(df.fillna(-1)) #填充缺失值为'-1'
print(df.fillna(method='ffill')) #向下填充缺失值
#年龄列的缺失值用其均值填充
print(df['年龄'].fillna(df['年龄'].mean()))
print(df.fillna(df.mode())) #利用众数填充缺失值
for n in df:
df[n]=df[n].interpolate() #数值型属性用线性插值
df[n].dropna(inplace=True)
print(df)
YXN-python
2023-03-25