零、准备工作

1
2
3
4
5
6
import pandas as pd
import numpy as np
# 读取数据
data = pd.read_excel('111.xlsx')
# 读取前五行
data.head()

一、查看各维度缺失值情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看size的缺失值
data['size'].isnull()
# 提取出来
data[data['size'].isnull()]
# 看看多少个
len(data[data['size'].isnull()])

# 批量获取每一列缺失值情况
for column in data.columns:
df = data[data[column].isnull()]
print(column,'缺失值个数为:',len(df),'缺失值占比为:',len(df)/len(data))
# 当某一个元素缺失的时候并不是“NaN”,即在excel里面为空,如“暂无数据”,需要做if elif else。
for column in data.columns:
if column != '最近地铁距离':
df = data[data[column].isnull()]
print(column,'缺失值个数为:',len(df),'缺失值占比为:',len(df)/len(data))
else:
df = data[data[column] == '暂无数据']
print(column,'缺失值个数为:',len(df),'缺失值占比为:',len(df)/len(data))

二、删除缺失值

1
2
3
4
5
6
7
# 删除全部缺失值,一行删掉,但“暂无数据”删不掉
df1 = data.dropna()
# 返工一下,即可取出剩下的“暂无数据”
df2 = df1[df1['最近地铁距离'] != '暂无数据']

#删除某一列缺失值比较严重的column
df3 = data.drop('XXX',axis = 1)

三、缺失值填充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 均值填充
print(data['房屋面积'].mean())
df4 = data['房屋面积'].fillna(data['房屋面积'].mean())

sum(df4.isnull()) # 可以检查是否完全填充

# 中位数填充
print(data['房屋面积'].median())
df5 = data['房屋面积'].fillna(data['房屋面积'].mediann())

# 众数填充,对于非数字类型的可以用
data['楼层'].mode() # 但输出的时候带有标签,不能直接用
data['楼层'].mode().values[0] # 即可只输出文字
df7 = data['楼层'].fillna(data['楼层'].mode().values[0]) # 实现

# 另:若缺失值的形式不是“NaN”,而是“暂无数据”这种
data['最近地铁距离'] = data['最近地铁距离'].replace('暂无数据',np.nan) # 先替换成NaN就行了
data['最近地铁距离'].fillna(data['最近地铁距离'.mean()])

# 前向填充
df8 = data.['最近地铁距离'].fillna(method = 'ffill') # 有现成的方法可以用
data.['最近地铁距离'].fillna(method = 'ffill').iloc[:20] # 查看前二十个是否成功

# 后向填充
df9 = data.['最近地铁距离'].fillna(method = 'bfill') # 后向同理
df10 = data.['最近地铁距离'].fillna(method = 'bfill',limit = 1) # 有连续三个nan,限定只后向填充一个,即只填一个