Pandas学习总结——6. 缺失数据处理

目录

      • 1 缺失值特性
        • 1.1 三种缺失值符号
        • 1.2 Nullable类型
        • 1.3 convert_dtypes方法
      • 2 缺失数据的运算规则
        • 2.1 普通运算
        • 2.2 groupby方法中的缺失值
      • 3 缺失数据的一些处理方法
        • 3.1 填充(fillna方法)
        • 3.2 剔除(dropna方法)
        • 3.3 插值(interpolation)
          • 3.3.1 线性插值
          • 3.3.2 高级插值方法
          • 3.3.3 interpolate中的参数

内容简介: 本篇首先介绍Pandas中的三种缺失值符号,针对其弊端介绍Nullable类型和NA符号,最后讲述了填充、剔除和插值三类缺失值处理方法。

缺失数据在数据预处理过程中非常常见,针对缺失数据Pandas有一定的解决方法,下面来简单介绍。

1 缺失值特性

缺失值可以通过isnanotna方法来查看,返回布尔值或布尔表。用info可以查看缺失信息。

1.1 三种缺失值符号

(1) np.nan

  • 不等与任何东西,甚至不等于自己
  • 在用equals函数比较时,自动略过两侧全是np.nan的单元格
  • 将原本整数的列变为浮点型
  • 布尔型数据的表中若用np.nan填充,所有值自动变为True
  • 修改布尔列表的值为np.nan,改变表类型

(2) None

  • np.nan相比,至少等于自身,即None == None结果为True
  • 布尔值为False
  • 修改布尔列表不会改变数据类型
  • 在传入数值类型后,会自动变为np.nan
  • 使用equals函数时不会被略过

(3 )NaT

  • 针对时间序列的np.nan
  • 与自己不等
  • 使用equals是也会被跳过

1.2 Nullable类型

为了解决上面三种类型带来的混乱与缺失值处理方法不统一问题,官方库在1.0后引入了Nullable类型。

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

(a)整形Nullable
对原来的int改为Int

s_new = pd.Series([1, 2], dtype="Int64")

Pandas学习总结——6. 缺失数据处理_第1张图片
(b)布尔 Nullable
记号为boolean

s_new = pd.Series([0, 1], dtype="boolean")

(c)String类型
记号为string,可以有效区分原本含糊不清的Object类型。

  • 本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型
  • 调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变
s = pd.Series(['dog','cat'],dtype='string')

Pandas学习总结——6. 缺失数据处理_第2张图片

1.3 convert_dtypes方法

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

pd.read_csv('data/table_missing.csv').dtypes

Pandas学习总结——6. 缺失数据处理_第3张图片

pd.read_csv('data/table_missing.csv').convert_dtypes().dtypes

Pandas学习总结——6. 缺失数据处理_第4张图片

2 缺失数据的运算规则

2.1 普通运算

  • 使用加法时,缺失值为0
  • 使用乘法时,缺失值为1
  • 使用累计函数时,缺失值自动略过

2.2 groupby方法中的缺失值

  • 自动忽略为缺失值的组
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})
df_g.groupby('one').groups

在这里插入图片描述

3 缺失数据的一些处理方法

3.1 填充(fillna方法)

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

df = pd.read_csv('data/table_missing.csv')

# 值填充
df['Physics'].fillna('missing').head()

# 前向填充:后一个值往前填
df['Physics'].fillna(method='ffill').head()

# 后向填充:下一个值往后填
df['Physics'].fillna(method='backfill').head()

值填充中需要注意对齐特性。具体见下面例子:

df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})
df_f.fillna(df_f.mean())

Pandas学习总结——6. 缺失数据处理_第5张图片

df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})
df_f.fillna(df_f.mean())

Pandas学习总结——6. 缺失数据处理_第6张图片

3.2 剔除(dropna方法)

  • axis参数选择剔除方向(0: 行;1: 列)
  • how参数选择剔除方式(all: 全为缺失去除;any: 存在缺失去除)
  • subset参数搜索范围内缺失值。
df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})

df_d.dropna(axis=0,subset=['B','C'])

3.3 插值(interpolation)

3.3.1 线性插值

(1)默认情况下,interpolate会对缺失的值进行线性插值(与索引无关):

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

s.interpolate().plot()

Pandas学习总结——6. 缺失数据处理_第7张图片
(2)method参数中的indextime选项可以使插值线性地依赖索引,即插值为索引的线性函数

s.interpolate(method='index').plot()

Pandas学习总结——6. 缺失数据处理_第8张图片
(3)索引是时间,那么可以按照时间长短插值

s_t = pd.Series([0,np.nan,10]
        ,index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')])

s_t.interpolate().plot()

Pandas学习总结——6. 缺失数据处理_第9张图片

s_t.interpolate(method='time').plot()

Pandas学习总结——6. 缺失数据处理_第10张图片

3.3.2 高级插值方法

与线性插值相比,高级插值方法包括了样条插值、多项式插值、阿基玛插值等(需要安装Scipy)
可以看官方文档了解

3.3.3 interpolate中的参数

(1)limit表示插值数的最大值

s = pd.Series([1,np.nan,np.nan,np.nan,5])
s.interpolate(limit=2)

Pandas学习总结——6. 缺失数据处理_第11张图片
(2)limit_direction表示插值方向,可选forward,backward,both,默认前向

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_direction='backward')

Pandas学习总结——6. 缺失数据处理_第12张图片
(3)limit_area表示插值区域,可选inside,outside,默认None

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='inside')

Pandas学习总结——6. 缺失数据处理_第13张图片

s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='outside')

Pandas学习总结——6. 缺失数据处理_第14张图片



如果您觉得文章对您有用,请给我点个赞吧!
您的肯定是对我最大的鼓励。

你可能感兴趣的:(Pandas)