常见的数据框缺失数据插补有3种方式:
- pandas 中简单粗暴的替换取值;
- pandas 中的 fillna 函数;
- sklearn 机器学习包中的 Imputer。
经过一番对比之后,先上结论:pandas 的 fillna 函数功能最多,使用最灵活,所以可考虑用为 Python 数据插补工具的首选。
1. 数据准备
(完整代码见文末)

2. 数据框缺失值的查看

这里从count我们可以看出,取值为1460(df的长度)则没有缺失,反之有缺失。
接下来,用 isnull 或者 isna 函数进行缺失值的查看。

可见,这里有两列出现了数据缺失,”Alley“列缺失严重。像这种级别的缺失的变量,能提供的信息过少,应该考虑删除。
接下来,我们改进下结果的展现方式。

”Alley”缺失的比例高达 94%。

上面 “LotFrontage” 变量是一个很常见的数值型变量,有18%的缺失值。接下来,我们用该变量的均值,对缺失的数据进行替代。
3. 第一种方式,pandas 中简单的手工插补
关键就是一个赋值的等号“=”。

4. 第二种方式,利用 pandas 的插补函数进行插补
同样是均值插补,用pandas自带的函数会让插补变得更加简洁。

除了具体某个值如均值(由函数生成)替代,pandas 还带有多种插补的函数:
- 基于正则表达式对字符型变量进行替代;
- 临近值替代;
- 使用 object 对象进行替代 …
更完整的说明,可以参考 pandas 官网文档:Working with missing data
5. 第三种方式:Sciki-Learn 的 imputer
作为机器学习第一包Sciki-Learn自带有功能丰富的数据插补函数,不过用起来稍显复杂。
比如,不能直接对某一列数据进行插补。

转换之后的df1,是 ndarray 而不是 dataframe。这是因为, Sciki-Learn 这个包是基于 NumPy 而不是pandas (虽然pandas 也是基于NumPy)。
考虑将这个 ndarray 数据转换为 DataFrame。

数据插补已经完成。
但是,这么操作显然过于啰嗦,难道 Sciki-Learn就不能直接插补一列?
答案是可以的——通过将某列写成二维的形式:

事实证明,Sciki-Learn是可以直接插补一列,只不过要将该列写成二维的样子(两个方括号)。
小结:
- pandas 和 sklearn 都提供了多种数据插补方式,其中最简单的是均值替代;
- pandas 的数据插补是最方便的;
- sklearn 基于 NumPy,且只能插补二维的数据(单列需要写成二维的形式)。
附完整代码:
#!/usr/bin/env python
import pandas as pd
import numpy as np
df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df.shape
df = df.iloc[:, 0:10]
df.shape
df.head()
from pandasgui import show
show(df)
df.info()
df.describe()
df.isnull().head()
df.isnull().sum()
df.isnull().sum() / len(df)
np.round(df.isnull().sum() / len(df), 2)
df.LotFrontage.describe()
df.LotFrontage.isnull().sum()
df.shape
df.LotFrontage.mean()
df["l"] = df.LotFrontage.copy()
df.l.describe()
df.l[df.l.isnull()] = df.l.mean()
df.l.isnull().sum()
df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df = df.iloc[:, 0:10]
df["l"] = df.LotFrontage.copy()
df.l.describe()
np.round(df.l.isnull().sum() / len(df), 2)
df.l.fillna(df.l.mean(), inplace=True)
np.round(df.l.isnull().sum() / len(df), 2)
df.l.describe()
df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df = df.iloc[:, 0:10]
df["l"] = df.LotFrontage.copy()
df.l.describe()
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values = np.nan, strategy = 'mean')
imputer
df1 = df[["l", "MSSubClass"]]
df1.describe()
df1 = imputer.fit_transform(df1)
pd.DataFrame(df1, columns=["l", "MSSubClass"]).describe()
df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df = df.iloc[:, 0:10]
df["l"] = df.LotFrontage.copy()
df.l.describe()
df[['l']] = imputer.fit_transform(df[['l']])
df.l.describe()
本文来自zhihu,观点不代表一起大数据-技术文章心得立场,如若转载,请注明出处:https://zhuanlan.zhihu.com/p/460546198
注意:本文归作者所有,未经作者允许,不得转载