缺失值预处理

  • 发布日期:2019-11-27
  • 难度:简单
  • 类别:数据预处理、缺失值
  • 标签:Python、缺失值、missingno

1. 问题描述

使用Python内置的函数与第三方库missingno,进行数据缺失值处理。

2. 程序实现

In [48]:
import pandas as pd
from io import StringIO
import matplotlib.pyplot as plt
csv_data = '''A,B,C,D
1.0,2.0,,4.0
5.0,6.0,,
9.0,10.0,11.0,12.0'''
df = pd.read_csv(StringIO(csv_data))
print(df)
     A     B     C     D
0  1.0   2.0   NaN   4.0
1  5.0   6.0   NaN   NaN
2  9.0  10.0  11.0  12.0
In [49]:
import missingno as msno
msno.matrix(df)
plt.show()
In [50]:
print(df.isnull())  
#如果是缺失值返回True,否则返回False
       A      B      C      D
0  False  False   True  False
1  False  False   True   True
2  False  False  False  False
In [51]:
print(df.isnull().sum())  
#返回每列包含的缺失值的个数
A    0
B    0
C    2
D    1
dtype: int64
In [52]:
print(df.dropna())   
#删除含有缺失值的行
     A     B     C     D
2  9.0  10.0  11.0  12.0
In [53]:
print(df.dropna(axis = 1))   
#删除含有缺失值的列
     A     B
0  1.0   2.0
1  5.0   6.0
2  9.0  10.0
In [54]:
print(df.dropna(how = 'all'))  
#删除全为缺失值NA的行
     A     B     C     D
0  1.0   2.0   NaN   4.0
1  5.0   6.0   NaN   NaN
2  9.0  10.0  11.0  12.0
In [55]:
print(df.dropna(thresh = 3)) 
#保留至少有3个非NA值的观测的行
     A     B     C     D
0  1.0   2.0   NaN   4.0
2  9.0  10.0  11.0  12.0
In [56]:
print(df.dropna(subset = ['D']))  
#删除含有缺失值的特定的列,subset通过表头来定位
     A     B     C     D
0  1.0   2.0   NaN   4.0
2  9.0  10.0  11.0  12.0
In [57]:
print(df.fillna(0))  
#用某个常数填充
     A     B     C     D
0  1.0   2.0   0.0   4.0
1  5.0   6.0   0.0   0.0
2  9.0  10.0  11.0  12.0
In [58]:
print(df.fillna(method='ffill'))   
#用上一行的数值填充(可用axis参数按列填充)
#因第一行第三列数值为缺失值,故第三列的两个缺失值无法通过此方法补全
     A     B     C     D
0  1.0   2.0   NaN   4.0
1  5.0   6.0   NaN   4.0
2  9.0  10.0  11.0  12.0
In [59]:
print(df.fillna(method='bfill'))   
#用下一行的数值填充(可用axis参数按列填充)
     A     B     C     D
0  1.0   2.0  11.0   4.0
1  5.0   6.0  11.0  12.0
2  9.0  10.0  11.0  12.0
In [60]:
print(df.fillna(df.mean()))   
#用该列均值填充,中位数为median(),众数为mode()
     A     B     C     D
0  1.0   2.0  11.0   4.0
1  5.0   6.0  11.0   8.0
2  9.0  10.0  11.0  12.0
In [61]:
print(df.fillna({'C':10.0,'D':-1}))  
#通过字典实现对不同的列填充不同值
     A     B     C     D
0  1.0   2.0  10.0   4.0
1  5.0   6.0  10.0  -1.0
2  9.0  10.0  11.0  12.0
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]: