# 第六章 缺失数据

第六章 缺失数据

本节介绍数据处理中的缺失数据内容,pandas 在 1.0 以后,对数据类型做了新的尝试,尤其对于 Nullable 类型和 String 类型

先看一下表信息

import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_1NaNMstreet_1173NaN34.0A+
1S_1C_1NaNFstreet_2192NaN32.5B+
2S_1C_11103.0Mstreet_2186NaN87.2B+
3S_1NaNNaNFstreet_216781.080.4NaN
4S_1C_11105.0NaNstreet_415964.084.8A-

一、缺失观测及其类型

1. 了解缺失信息

(a)isna 和 notna 方法

对 series 使用返回布尔列表

df['Physics'].isna().head()

0 False
1 False
2 False
3 True
4 False
Name: Physics, dtype: bool

df['Physics'].notna().head()

0 True
1 True
2 True
3 False
4 True
Name: Physics, dtype: bool

对 DataFrame 使用会返回布尔表

df.isna().head()

School Class ID Gender Address Height Weight Math Physics
0 False False True False False False True False False
1 False False True False False False True False False
2 False False False False False False True False False
3 False True True False False False False False True
4 False False False True False False False False False

对于 DataFrame 我们更加关心每列有多少缺失值

df.isna().sum()

School 0
Class 4
ID 6
Gender 7
Address 0
Height 0
Weight 13
Math 5
Physics 4
dtype: int64

通过 .info 函数查看缺失信息

df.info()

<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 35 entries, 0 to 34
Data columns (total 9 columns):

Column Non-Null Count Dtype


0 School 35 non-null object
1 Class 31 non-null object
2 ID 29 non-null float64
3 Gender 28 non-null object
4 Address 35 non-null object
5 Height 35 non-null int64
6 Weight 22 non-null float64
7 Math 30 non-null float64
8 Physics 31 non-null object
dtypes: float64(3), int64(1), object(5)
memory usage: 2.6+ KB

查看缺失值的所在行

以最后一列为例,挑出该列缺失值的行

df['Physics'].isna()

0 False
1 False
2 False
3 True
4 False
5 False
6 False
7 False
8 True
9 False
10 False
11 False
12 False
13 True
14 False
15 False
16 False
17 False
18 False
19 False
20 False
21 False
22 True
23 False
24 False
25 False
26 False
27 False
28 False
29 False
30 False
31 False
32 False
33 False
34 False
Name: Physics, dtype: bool

df[df['Physics'].isna()]

School Class ID Gender Address Height Weight Math Physics
3 S_1 NaN NaN F street_2 167 81.0 80.4 NaN
8 S_1 C_2 1204.0 F street_5 162 63.0 33.8 NaN
13 S_1 C_3 1304.0 NaN street_2 195 70.0 85.2 NaN
22 S_2 C_2 2203.0 M street_4 155 91.0 73.8 NaN

挑选出所有非确实值列

使用 all 表示全部非缺失值,如果是 any 就是至少有一个不是缺失值

df[df.notna().all(1)]

School Class ID Gender Address Height Weight Math Physics
5 S_1 C_2 1201.0 M street_5 159 68.0 97.0 A-
6 S_1 C_2 1202.0 F street_4 176 94.0 63.5 B-
12 S_1 C_3 1303.0 M street_7 188 82.0 49.7 B
17 S_2 C_1 2103.0 M street_4 157 61.0 52.5 B-
21 S_2 C_2 2202.0 F street_7 194 77.0 68.5 B+
25 S_2 C_3 2301.0 F street_4 157 78.0 72.3 B+
27 S_2 C_3 2303.0 F street_7 190 99.0 65.9 C
28 S_2 C_3 2304.0 F street_6 164 81.0 95.5 A-
29 S_2 C_3 2305.0 M street_4 187 73.0 48.9 B

三种缺失符号

np.nan

np.nan 是个非常麻烦的东西,他不等于任何东西,甚至不等于自己

np.nan == np.nan

False

np.nan == 0

False

np.nan == None

False

在用 equals 函数比较时,自动略过两侧全是 np.nan 的单元格,因此结果不会影响

df.equals(df)

True

其次,它在 numpy 中的类型为浮点,由此导致数据集读入时,即使原来是整数的列,只要有缺失值就会变成浮点型

type(np.nan)

float

pd.Series([1,2,3]).dtype

dtype(‘int64’)

pd.Series([1,np.nan,3]).dtype

dtype(‘float64’)

此外对于布尔类型的列表,如果是 np.nan 填充,那么他的值会自动变为 True 而不是 False

pd.Series([1,np.nan,3],dtype='bool')

0 True
1 True
2 True
dtype: bool

但当修改一个布尔列表时,会改变列表类型,而不是赋值为True

s = pd.Series([True,False],dtype='bool')
s[1]=np.nan
s

0 1.0
1 NaN
dtype: float64

在所有的表格读取后,无论列是存放什么类型的数据,默认的缺失值全为np.nan类型

因此整型列转为浮点;而字符由于无法转化为浮点,因此只能归并为object类型(‘O’),原来是浮点型的则类型不变

(b) None

None 比前者稍微好点,至少他会等于自身

None == None

True

它的布尔值为 False

pd.Series([None],dtype='bool')

0 False
dtype: bool

修改布尔列表不会改变数据类型

s = pd.Series([True,False],dtype='bool')
s[0]=None
s

0 False
1 False
dtype: bool

© NaT

NaT 是针对时间序列的缺失值,是 Pandas 的内置类型,可以看做是时序版的 np.nan

s = pd.Series([True,False],dtype='bool')
s[1]=pd.NaT
s

0 True
1 True
dtype: bool

3. Nullable类型与NA符号

(a)Nullable整形

对于该种类型而言,它与原来标记int上的符号区别在于首字母大写:‘Int’

它的好处就在于,其中前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型

(b)Nullable布尔

对于该种类型而言,作用与上面的类似,记号为boolean

(c)string类型

该类型是1.0的一大创新,目的之一就是为了区分开原本含糊不清的object类型,这里将简要地提及string,因为它是第7章的主题内容

它本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型

此外,和object类型的一点重要区别就在于,在调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变

4. NA的特性

(a)逻辑运算

只需看该逻辑运算的结果是否依赖pd.NA的取值,如果依赖,则结果还是NA,如果不依赖,则直接计算结果

5. convert_dtypes方法

这个函数的功能往往就是在读取数据时,就把数据列转为Nullable类型,是1.0的新函数

二、缺失数据的运算与分组

1. 加号与乘号规则

使用加法时,缺失值为0

使用乘法时,缺失值为1

使用累计函数时,缺失值自动略过

2. groupby方法中的缺失值

自动忽略为缺失值的组

三、填充与剔除

1. fillna方法

(a)值填充与前后向填充(分别与ffill方法和bfill方法等价)

(b)填充中的对齐特性

2. dropna方法

(a)axis参数

df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})
df_d

​ A B C

0 NaN NaN 3
1 NaN 3.0 2
2 NaN 2.0 1

df_d.dropna(axis=0)

df_d.dropna(axis=1)

C
0 3
1 2
2 1

(b)how参数(可以选all或者any,表示全为缺失去除和存在缺失去除)

print(df_d.dropna(axis=1,how='all'))
print(df_d)
 B  C

0 NaN 3
1 3.0 2
2 2.0 1
A B C
0 NaN NaN 3
1 NaN 3.0 2
2 NaN 2.0 1

(c)subset参数(即在某一组列范围中搜索缺失值)

四、插值(interpolation)

1. 线性插值

(a)索引无关的线性插值

默认状态下,interpolate会对缺失的值进行线性插值

s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s

0 1.0
1 10.0
2 15.0
3 -5.0
4 -2.0
5 NaN
6 NaN
7 28.0
dtype: float64

(b)与索引有关的插值

method中的index和time选项可以使插值线性地依赖索引,即插值为索引的线性函数

2. 高级插值方法

此处的高级指的是与线性插值相比较,例如样条插值、多项式插值、阿基玛插值等(需要安装Scipy),方法详情请看这里

关于这部分仅给出一个官方的例子,因为插值方法是数值分析的内容,而不是Pandas中的基本知识:

3. interpolate中的限制参数

(a)limit表示最多插入多少个

(b)limit_direction表示插值方向,可选forward,backward,both,默认前向

(c)limit_area表示插值区域,可选inside,outside,默认None

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值