pandas系列之缺失值的处理

1,783 阅读6分钟

缺失值是由于某些原因导致部分数据为空。对于缺失值一般有2种处理方式,要么删除,要么填充(用某个值代替缺失值)。缺失值一般分2种,一种是某一列的数据缺失。另一种是整行数据都缺失,即一个空行。

本文所用到的Excel表格内容如下:

QQ拼音截图未命名.png

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