缺失值是由于某些原因导致部分数据为空。对于缺失值一般有2种处理方式,要么删除,要么填充(用某个值代替缺失值)。缺失值一般分2种,一种是某一列的数据缺失。另一种是整行数据都缺失,即一个空行。
本文所用到的Excel表格内容如下:
1.缺失值查看
1.1 先打印一下数据结构看一下整体情形
import pandas as pd
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df)
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 12.0
1 西北 NaN 西安 NaT 87.0
2 华南 广东 深圳 2019-09-08 NaN
3 华北 北京 北京 2021-05-13 45.0
4 华中 湖北 武汉 NaT 21.0
5 东北 黑龙江 哈尔滨 2019-09-11 42.0
6 NaN NaN NaN NaT NaN
7 华南 NaN 广州 2019-09-13 34.0
8 华北 河北 石家庄 NaT 56.0
9 华中 NaN 益阳 2019-09-15 NaN
10 东北 辽宁 鞍山 NaT 32.0
11 华中 湖北 荆州 2019-09-17 32.0
从结果来看,每一列均有缺失值。这里特别注意,时间日期类型的数据缺失值用NaT表示,其他类型的都用NaN来表示。千万不要笼统的认为缺失值都是用NaN来表示
1.2 info():查看缺失值的情形
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.info())
result:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12 entries, 0 to 11
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 区域 11 non-null object
1 省份 8 non-null object
2 城市 11 non-null object
3 时间 7 non-null datetime64[ns]
4 指标 9 non-null float64
dtypes: datetime64[ns](1), float64(1), object(3)
memory usage: 608.0+ bytes
None
从结果来看,省份这一列是9 non-null。说明省份这一列有4个null值。同理,时间这一列有4个缺失值,指标这一列有2个缺失值,城市这一列有1个缺失值,区域这一列有1个缺失值
2.缺失值的判断
isnull():判断具体的某个值是否是缺失值,如果是则返回True,反之则为False
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.isnull())
result:
区域 省份 城市 时间 指标
0 False False False False False
1 False True False True False
2 False False False False True
3 False False False False False
4 False False False True False
5 False False False False False
6 True True True True True
7 False True False False False
8 False False False True False
9 False True False False True
10 False False False True False
11 False False False False False
3.删除缺失值
dropna():删除缺失值
3.1 严格删除所有所有有缺失值的行
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.dropna())
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 12.0
3 华北 北京 北京 2021-05-13 45.0
5 东北 黑龙江 哈尔滨 2019-09-11 42.0
11 华中 湖北 荆州 2019-09-17 32.0
从结果来看,dropna()方法默认会删除含有缺失值的行,只要这一行有一个字段缺失,就会被删除。所以最终只保留了4条完整的数据记录
3.2 只删除空白行
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.dropna(how='all'))
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 12.0
1 西北 NaN 西安 NaT 87.0
2 华南 广东 深圳 2019-09-08 NaN
3 华北 北京 北京 2021-05-13 45.0
4 华中 湖北 武汉 NaT 21.0
5 东北 黑龙江 哈尔滨 2019-09-11 42.0
7 华南 NaN 广州 2019-09-13 34.0
8 华北 河北 石家庄 NaT 56.0
9 华中 NaN 益阳 2019-09-15 NaN
10 东北 辽宁 鞍山 NaT 32.0
11 华中 湖北 荆州 2019-09-17 32.0
how='all'代表只删除所有字段均为缺失值的行,即只删除空白行。所以保留了11条记录。只删除了第6行这个空白行。
4.缺失值补充
一般有用0填充,用平均值填充,用众数填充(大多数时候用这个),向前填充(用缺失值的上一行对应字段的值填充,比如D3单元格缺失,那么就用D2单元格的值填充)、向后填充(与向前填充对应)等方式。
4.1填充所有缺失值
fillna():缺失值,参数代表要填充的内容。
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.fillna(0))
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 00:00:00 12.0
1 西北 0 西安 0 87.0
2 华南 广东 深圳 2019-09-08 00:00:00 0.0
3 华北 北京 北京 2021-05-13 00:00:00 45.0
4 华中 湖北 武汉 0 21.0
5 东北 黑龙江 哈尔滨 2019-09-11 00:00:00 42.0
6 0 0 0 0 0.0
7 华南 0 广州 2019-09-13 00:00:00 34.0
8 华北 河北 石家庄 0 56.0
9 华中 0 益阳 2019-09-15 00:00:00 0.0
10 东北 辽宁 鞍山 0 32.0
11 华中 湖北 荆州 2019-09-17 00:00:00 32.0
从结果来看,该方法默认情形下会对所有缺失值进行填充
4.2 填充指定单列
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.fillna({'区域': "上海"}))
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 12.0
1 西北 NaN 西安 NaT 87.0
2 华南 广东 深圳 2019-09-08 NaN
3 华北 北京 北京 2021-05-13 45.0
4 华中 湖北 武汉 NaT 21.0
5 东北 黑龙江 哈尔滨 2019-09-11 42.0
6 上海 NaN NaN NaT NaN
7 华南 NaN 广州 2019-09-13 34.0
8 华北 河北 石家庄 NaT 56.0
9 华中 NaN 益阳 2019-09-15 NaN
10 东北 辽宁 鞍山 NaT 32.0
11 华中 湖北 荆州 2019-09-17 32.0
4.3 填充多列
4.3.1 指定多列填充一样的内容
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.fillna({'区域': "上海", "省份": "上海"}))
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 12.0
1 西北 上海 西安 NaT 87.0
2 华南 广东 深圳 2019-09-08 NaN
3 华北 北京 北京 2021-05-13 45.0
4 华中 湖北 武汉 NaT 21.0
5 东北 黑龙江 哈尔滨 2019-09-11 42.0
6 上海 上海 NaN NaT NaN
7 华南 上海 广州 2019-09-13 34.0
8 华北 河北 石家庄 NaT 56.0
9 华中 上海 益阳 2019-09-15 NaN
10 东北 辽宁 鞍山 NaT 32.0
11 华中 湖北 荆州 2019-09-17 32.0
4.3.2 指定多列填充不一样的内容
df = pd.read_excel(r'C:\Users\admin\Desktop\data_test.xlsx')
print(df.fillna({'区域': "中国", "省份": "上海"}))
result:
区域 省份 城市 时间 指标
0 东北 辽宁 大连 2019-09-06 12.0
1 西北 上海 西安 NaT 87.0
2 华南 广东 深圳 2019-09-08 NaN
3 华北 北京 北京 2021-05-13 45.0
4 华中 湖北 武汉 NaT 21.0
5 东北 黑龙江 哈尔滨 2019-09-11 42.0
6 中国 上海 NaN NaT NaN
7 华南 上海 广州 2019-09-13 34.0
8 华北 河北 石家庄 NaT 56.0
9 华中 上海 益阳 2019-09-15 NaN
10 东北 辽宁 鞍山 NaT 32.0
11 华中 湖北 荆州 2019-09-17 32.0