【利用python进行数据分析】学习笔记-第7章 数据清洗和准备——处理缺失数据

第7章 数据清洗和准备

7.1 处理缺失数据

7.1.1 查看缺失数据

# pandas使⽤浮点值NaN(Not a Number)表示缺失数据。我们称其为哨兵值,可以⽅便的检测出来
In [10]: string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
                                  
In [11]: string_data
Out[11]:
0   aardvark
1  artichoke
2        NaN
3    avocado
dtype: object
                                  
In [12]: string_data.isnull()
Out[12]:
0  False
1  False
2   True
3  False
dtype: bool
                                  
# 在pandas中,我们采⽤了R语⾔中的惯⽤法,即将缺失值表示为NA,它表示不可⽤not available
# Python内置的None值在对象数组中也可以作为NA
In [13]: string_data[0] = None
In [14]: string_data.isnull()
Out[14]:
0   True
1  False
2   True
3  False
dtype: bool
  • 缺失数据处理的函数

    函数说明
    dropna根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度
    fillna用指定值或插值方法(如ffill或bfill)填充缺失数据
    isnull返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样
    notnullisnull的否定式

7.1.2 滤除缺失数据

# 对于⼀个Series,dropna返回⼀个仅含⾮空数据和索引值的Series
In [15]: from numpy import nan as NA
    
In [16]: data = pd.Series([1, NA, 3.5, NA, 7])
    
In [17]: data.dropna()
Out[17]:
0  1.0
2  3.5
4  7.0
dtype: float64
    
# 等价于:
In [18]: data[data.notnull()]
Out[18]:
0  1.0
2  3.5
4  7.0
dtype: float64
    
# 对于DataFrame对象,dropna默认丢弃任何含有缺失值的⾏
In [19]: data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
   ....:                      [NA, NA, NA], [NA, 6.5, 3.]])
    
In [20]: cleaned = data.dropna()
    
In [21]: data
Out[21]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

In [22]: cleaned
Out[22]:
     0    1    2
0  1.0  6.5  3.0

# 传⼊how='all'将只丢弃全为NA的那些⾏
In [23]: data.dropna(how='all')
Out[23]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
3  NaN  6.5  3.0

# ⽤这种⽅式丢弃列,只需传⼊axis=1即可
In [24]: data[4] = NA
In [25]: data
Out[25]:
     0    1    2    4
0  1.0  6.5  3.0  NaN
1  1.0  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3  NaN  6.5  3.0  NaN

In [26]: data.dropna(axis=1, how='all')
Out[26]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

# 另⼀个滤除DataFrame⾏的问题涉及时间序列数据。假设你只想留下⼀部分观测数据,可以⽤thresh参数实现此⽬的
In [27]: df = pd.DataFrame(np.random.randn(7, 3))
    
In [28]: df.iloc[:4, 1] = NA
    
In [29]: df.iloc[:2, 2] = NA
    
In [30]: df
Out[30]:
           0          1          2
0  -0.204708        NaN        NaN
1  -0.555730        NaN        NaN
2   0.092908        NaN   0.769023
3   1.246435        NaN  -1.296221
4   0.274992   0.228913   1.352917
5   0.886429  -2.001637  -0.371843
6   1.669025  -0.438570  -0.539741

In [31]: df.dropna()
Out[31]:
          0          1          2
4  0.274992   0.228913   1.352917
5  0.886429  -2.001637  -0.371843
6  1.669025  -0.438570  -0.539741

In [32]: df.dropna(thresh=2)
Out[32]:
          0          1          2
2  0.092908        NaN   0.769023
3  1.246435        NaN  -1.296221
4  0.274992   0.228913   1.352917
5  0.886429  -2.001637  -0.371843
6  1.669025  -0.438570  -0.539741

7.1.3 填充缺失数据

# 通过⼀个常数调⽤fillna就会将缺失值替换为那个常数
In [33]: df.fillna(0)
Out[33]:
           0          1          2
0  -0.204708   0.000000   0.000000
1  -0.555730   0.000000   0.000000
2   0.092908   0.000000   0.769023
3   1.246435   0.000000  -1.296221
4   0.274992   0.228913   1.352917
5   0.886429  -2.001637  -0.371843
6   1.669025  -0.438570  -0.539741

# 若是通过⼀个字典调⽤fillna,就可以实现对不同的列填充不同的值
In [34]: df.fillna({1: 0.5, 2: 0})
Out[34]:
           0         1         2
0  -0.204708   0.500000   0.000000
1  -0.555730   0.500000   0.000000
2   0.092908   0.500000   0.769023
3   1.246435   0.500000  -1.296221
4   0.274992   0.228913   1.352917
5   0.886429  -2.001637  -0.371843
6   1.669025  -0.438570  -0.539741

# 对reindexing有效的那些插值⽅法也可⽤于fillna
In [37]: df = pd.DataFrame(np.random.randn(6, 3))
    
In [38]: df.iloc[2:, 1] = NA
    
In [39]: df.iloc[4:, 2] = NA
    
In [40]: df
Out[40]:
           0         1          2
0   0.476985  3.248944  -1.021228
1  -0.577087  0.124121   0.302614
2   0.523772       NaN   1.343810
3  -0.713544       NaN  -2.370232
4  -1.860761       NaN        NaN
5  -1.265934       NaN        NaN

In [41]: df.fillna(method='ffill')
Out[41]:
           0         1          2
0   0.476985  3.248944  -1.021228
1  -0.577087  0.124121   0.302614
2   0.523772  0.124121   1.343810
3  -0.713544  0.124121  -2.370232
4  -1.860761  0.124121  -2.370232
5  -1.265934  0.124121  -2.370232

In [42]: df.fillna(method='ffill', limit=2)
Out[42]:
           0         1          2
0   0.476985  3.248944  -1.021228
1  -0.577087  0.124121   0.302614
2   0.523772  0.124121   1.343810
3  -0.713544  0.124121  -2.370232
4  -1.860761       NaN  -2.370232
5  -1.265934       NaN  -2.370232

# 就可以利⽤fillna实现许多别的功能。⽐如说,可以传⼊Series的平均值或中位数
In [43]: data = pd.Series([1., NA, 3.5, NA, 7])
In [44]: data.fillna(data.mean())
Out[44]:
0  1.000000
1  3.833333
2  3.500000
3  3.833333
4  7.000000
dtype: float64
  • fillna函数的参数:

    参数说明
    value用于填充缺失值的标量值或字典对象
    method插值方式
    axis待填充的轴
    inplace修改调用者对象而不产生副本
    limit可以连续填充的最大数量
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

From Star.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值