Pandas缺失数据学习

1.缺失值信息的了解

主要有两种方法可以了解Series和DateFrame数据格式的详细的缺失值信息,即isna和notna。

DataFrame.isna()
Series.isna()   # 缺失值返回False
DataFrame.notna()
Series.notna()   # 缺失值返回True

每一列缺失值的汇总

DataFrame.isna().sum()  # 统计每列缺失值的总数
DataFrame.notna().sum()   # 统计每列非缺失值的总数

可以通过info函数查看确实的具体信息

DataFrame.info()

挑选出缺失值和非缺失值的行

DataFrame[DataFrame.isna().any(1)]  # 使用all就是全部缺失值,如果是any就是至少有一个是缺失值
DataFrame[DataFrame.notna().all(1)] # 使用all就是全部非缺失值,如果是any就是至少有一个不是缺失值

2.缺失值符号

  1. np.nan float类型
  2. None bool类型
  3. NaT 是针对时间序列的缺失值,是Pandas的内置类型,可以完全看做时序版本的np.nan

np.nan和None等值性比较的总结:(True表示被判定为相等):

类型 None对None NaN对NaN None对NaN
单值 True False False
tuple(整体) True True False
np.array(逐个) True False False
Series(逐个) False False False
assert_equals True True False
Series.equals True True True
merge True True True

实践中,建议遵循以下三个原则即可:
1.在用pandas和numpy处理数据阶段将None,NaN统一处理成NaN,以便支持更多的函数。
2.如果要判断Series,numpy.array整体的等值性,用专门的Series.equals,numpy.array函数去处理,不要自己用==判断。
3.如果要将数据导入数据库,将NaN替换成None。

3.Nullable类型与NA类型

这是Pandas在1.0新版本中引入的重大改变,其目的就是为了(在若干版本后)解决之前出现的混乱局面,统一缺失值处理方法。

1.Nullable整型(记号为Int)
2.Nullable布尔(记号为boolean)
3.string类型 (它本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型,string)

4.NA的特性

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

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

5.convert_dtypes方法

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


缺失数据的运算与分组

1.加号与乘号规则

  1. 使用加法时,缺失值为0;、
  2. 使用乘法时,缺失值为1;
  3. 使用累计函数时,缺失值自动略过。

2. groupby方法中的缺失值

自动忽略为缺失值的组

填充与剔除

  1. fillna方法
    (a)值填充与前后向填充(分别与ffill方法和bfill方法等价)
    (b)填充中的对齐特性
  2. dropna方法
    (a)axis参数
    (b)how参数(可以选all或者any,表示全为缺失去除和存在缺失去除)
    (c)subset参数(即在某一组列范围中搜索缺失值)

插值(interpolation)

  1. 线性插值
    (a)索引无关的线性插值(默认状态下,interpolate会对缺失的值进行线性插值)
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s.interpolate()
s.interpolate().plot()

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

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

如果索引是时间,那么可以按照时间长短插值

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()
s_t.interpolate(method='time').plot()
  1. 高级插值方法
    此处的高级指的是与线性插值相比较,例如样条插值、多项式插值、阿基玛插值等(需要安装Scipy),方法详情请看这里
ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))
missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])
ser[missing] = np.nan
methods = ['linear', 'quadratic', 'cubic']
df = pd.DataFrame({
     m: ser.interpolate(method=m) for m in methods})
df.plot()
  1. interpolate中的限制参数
    (a)limit表示最多插入多少个
    (b)limit_direction表示插值方向,可选forward,backward,both,默认前向
    (c)limit_area表示插值区域,可选inside,outside,默认None

参考:
1.https://blog.csdn.net/daliangliangliangge/article/details/103683129?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase
2.joyful-pandas-master

你可能感兴趣的:(pandas)