pandas1.0.5学习笔记(六)缺失数据

pandas1.0.5学习笔记(六)缺失数据

  • 摘要
  • 数据及背景
  • 理论简介
  • 知识总结
    • 缺失观测
    • 缺失数据类型
    • Nullable类型与NA符号
    • NA的特性
    • convert_dtypes方法
    • 缺失数据的运算与分组
    • 填充与剔除
    • 插值(interpolation)
  • 问题
    • 1.如何删除缺失值占比超过25%的列?
    • 2.现需要将A中的部分单元转为缺失值,单元格中的最小转换概率为25%,且概率大小与所在行B列单元的值成正比。
    • 3.请结合身高列和地区列中的数据,对体重进行合理插值。
  • 参考

摘要

缺失数据处理:在数据处理过程中,缺失数据(missing value)的处理设计删除,替换,差值等操作,这些操作过程中又可能涉及数据类型的改变,可能会导致数据的丢失/破坏。在新版本pandas1.0.5中提出了Nullable类型数据,来(在若干版本之后)解决之前的混乱局面。

数据及背景

https://github.com/datawhalechina/joyful-pandas

理论简介

这是Pandas在1.0新版本中引入的重大改变,其目的就是为了(在若干版本后)解决之前出现的混乱局面,统一缺失值处理方法
"The goal of pd.NA is provide a “missing” indicator that can be used consistently across data types (instead of np.nan, None or pd.NaT depending on the data type)."——User Guide for Pandas v-1.0
官方鼓励用户使用新的数据类型和缺失类型pd.NA
nullable类型包含:nullable整型(Int64),布尔型(boolean),string型
pandas1.0版本之前,np.nan,None,np.NaT在数据与处理的过程中会因为一些操作改变数据类型,以致于数据的使用不便。有了nullable类型之后,有了统一的确实类型pd.NA,在进行数据的处理过程中,即使使用了np.nan,None,np.NaT去改变数据,df中总是存储NA,且不会改变数据类型。
此外,由于nuallable类型的出现,有string类型的数据,解决了object类型数据在调用字符方法后,会根据缺失类型和数据类型而改变的问题,而string类型返回的是Nullable类型。

知识总结

缺失观测

(a)isna和notna方法:
          df.isna()/df.notna()
(b)查看缺失值的所以在行:
          df[df[‘xxx’].isna()]
(c)挑选出所有非缺失值列:
      df[df.notna().all(1)]/df[df.notna().any(1)]

缺失数据类型

(a) np.nan
  在用equals函数比较时,自动略过两侧全是np.nan的单元格,因此结果不会影响
  其次,它在numpy中的类型为浮点,由此导致数据集读入时,即使原来是整数的列,只要有缺失值就会变为浮点型
  此外,对于布尔类型的列表,如果是np.nan填充,那么它的值会自动变为True而不是False
  但当修改一个布尔列表时,会改变列表类型,而不是赋值为True
  在所有的表格读取后,无论列是存放什么类型的数据,默认的缺失值全为np.nan类型,因此整型列转为浮点;而字符由于无法转化为浮点,因此只能归并为object类型(‘O’),原来是浮点型的则类型不变
(b) None
  它的布尔值为False
  修改布尔列表不会改变数据类型
  在传入数值类型后,会自动变为np.nan
  在使用equals函数时不会被略过
© np.NaT
  NaT是针对时间序列的缺失值,是Pandas的内置类型,可以完全看做时序版本的np.nan,与自己不等,且使用equals是也会被跳过

Nullable类型与NA符号

(a)Nullable整形(Int64)
  对于该种类型而言,它与原来标记int上的符号区别在于首字母大写:‘Int’。
  有时候有缺失值时,缺失值用 np.nan 会把整列当作float处理,这样对ID类数据会有问题(如身份证号码转成float再转成str或int,原有数据可能丢失了),所以提供了一个“Int64”来处理缺失值,大小写可能是为了区分pandas中的64位整型Int64和numpy中的64位整型int64,而numpy的int64对缺失值的支持不好。
  它的好处就在于,其中前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型
(b)Nullable布尔
  对于该种类型而言,作用与上面的类似,记号为boolean
(c)string类型
  该类型是1.0的一大创新,目的之一就是为了区分开原本含糊不清的object类型,它本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型
  此外,和object类型的一点重要区别就在于,在调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变

NA的特性

(a)逻辑运算
只需看该逻辑运算的结果是否依赖pd.NA的取值,如果依赖,则结果还是NA,如果不依赖,则直接计算结果
(b)算术运算和比较运算
这里只需记住除了下面两类情况,其他结果都是NA即可

	pd.NA ** 0 = 1	
	1 ** pd.NA =1

convert_dtypes方法

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

缺失数据的运算与分组

  1. 加号与乘号规则
  2. groupby方法中的缺失值

填充与剔除

  1. fillna方法
    (a)值填充与前后向填充
    (b)填充中的对齐特性
  2. dropna方法
    (a)axis参数,默认为any
    (b)how参数(可以选all或者any,表示全为缺失去除和存在缺失去除)

插值(interpolation)

  1. 线性插值
    (a)索引无关的线性插值
    默认状态下,interpolate会对缺失的值进行线性插值
    (b)与索引有关的插值
    method中的index和time选项可以使插值线性地依赖索引,即插值为索引的线性函数
  2. 高级插值方法
    此处的高级指的是与线性插值相比较,例如样条插值、多项式插值、阿基玛插值等(需要安装Scipy),方法详情请看这里
    关于这部分仅给出一个官方的例子,因为插值方法是数值分析的内容,而不是Pandas中的基本知识:
  3. interpolate中的限制参数
    (a)limit表示最多插入多少个
    (b)limit_direction表示插值方向,可选forward,backward,both,默认前向
    (c)limit_area表示插值区域,可选inside,outside,默认None

问题

1.如何删除缺失值占比超过25%的列?

def drop_col(df, col_name, cutoff=0.5):
    n = len(df)
    cnt = df[col_name].count()
    if (float(cnt) / n) < cutoff:
        df.drop(col_name, axis=1, inplace=1)
        
drop_col(df, 'col_1', cutoff=0.75)

2.现需要将A中的部分单元转为缺失值,单元格中的最小转换概率为25%,且概率大小与所在行B列单元的值成正比。

min_B = df['B'].min()
df['A'] = pd.Series(list(zip(df['A'].values,df['B'].values))).apply(lambda x: x[0] if np.random.rand()>0.25*x[1]/min_B else np.nan)

3.请结合身高列和地区列中的数据,对体重进行合理插值。

df_method_1 = df.copy()
for name,group in df_method_1.groupby('地区'):
    df_method_1.loc[group.index, '体重'] = group[['身高','体重']].sort_values(by='身高').interpolate()['体重']
df_method_1['体重'] = df_method_1['体重'].round(decimals=2)

参考

[1] https://github.com/datawhalechina/joyful-pandas
[2] https://blog.csdn.net/anshuai_aw1/article/details/82347016

你可能感兴趣的:(pandas,数据挖掘,数据分析,python)