• python学习——pandas数据丢失处理


    处理丢失数据

     

    有两种丢失数据:

    • None
    • np.nan(NaN)
    In [1]:
    import numpy as np
    
    In [12]:
    %timeit np.arange(0,10000,dtype=int).sum()
    
     
    21.3 µs ± 1.66 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    In [13]:
    %timeit np.arange(0,10000,dtype=float).sum()
    
     
    24.2 µs ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    In [14]:
    %timeit np.arange(0,10000,dtype=object).sum()
    
     
    679 µs ± 8.85 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
     

    1. None

    None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

     

    object类型的运算要比int类型的运算慢得多
    计算不同数据类型求和时间
    %timeit np.arange(1e5,dtype=xxx).sum()

    In [14]:
    %timeit np.arange(1e5,dtype=int).sum()
    
     
    185 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [15]:
    %timeit np.arange(1e5,dtype=float).sum()
    
     
    537 µs ± 24.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    In [16]:
    %timeit np.arange(1e5,dtype=object).sum()
    
     
    6.36 ms ± 180 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
     

    2. np.nan(NaN)

     

    np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

     

    但可以使用np.nan*()函数来计算nan,此时视nan为0。

    In [ ]:
     
     

    3. pandas中的None与NaN

     

    1) pandas中None与np.nan都视作np.nan

     

    创建DataFrame

    In [15]:
    import pandas as pd
    from pandas import Series,DataFrame
    
    In [19]:
    df = DataFrame({'age':[20,21,23,19,22],
                    'salary':[10000,11000,9900,8500,15000]},
                  index=['张三','李四','小昭','小郭','小齐'],
                  columns=['age','salary','work'])
    df
    
    Out[19]:
     agesalarywork
    张三 20 10000 NaN
    李四 21 11000 NaN
    小昭 23 9900 NaN
    小郭 19 8500 NaN
    小齐 22 15000 NaN
    In [21]:
    df.work['李四':'小郭'] = 'python'
    
     
    C:UsersBLXAppDataRoamingPythonPython37site-packagesipykernel_launcher.py:1: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame
    
    See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
      """Entry point for launching an IPython kernel.
    
    In [22]:
    df
    
    Out[22]:
     agesalarywork
    张三 20 10000 NaN
    李四 21 11000 python
    小昭 23 9900 python
    小郭 19 8500 python
    小齐 22 15000 NaN
     

    使用DataFrame行索引与列索引修改DataFrame数据

     

    2) pandas中None与np.nan的操作

     
    • isnull()
    • notnull()
    • dropna(): 过滤丢失数据
    • fillna(): 填充丢失数据
    In [ ]:
     
     

    (1)判断函数

    • isnull()
    • notnull()
    In [27]:
    # 根据获得的数据去除原来数据的空数据
    s1 = df.isnull().any(axis=1)
    
    In [29]:
    # 有了s1这个数据,可以获得哪些数据为空
    df[s1]
    
    Out[29]:
     agesalarywork
    张三 20 10000 NaN
    小齐 22 15000 NaN
    In [33]:
    # 保留非空数据 
    # .all()判断轴中所有数据都不为空,返回True
    s2 = df.notnull().all(axis=1)
    
    In [34]:
    df[s2]
    
    Out[34]:
     agesalarywork
    李四 21 11000 python
    小昭 23 9900 python
    小郭 19 8500 python
     

    (2) 过滤函数

    • dropna()
     

    可以选择过滤的是行还是列(默认为行)

    In [38]:
    df.dropna()
    
    Out[38]:
     agesalarywork
    李四 21 11000 python
    小昭 23 9900 python
    小郭 19 8500 python
    In [37]:
    df.dropna(axis = 1)
    
    Out[37]:
     agesalary
    张三 20 10000
    李四 21 11000
    小昭 23 9900
    小郭 19 8500
    小齐 22 15000
     

    也可以选择过滤的方式 how = 'all',一行中所有数据为空才删除

    In [39]:
    df.dropna(how='all')
    
    Out[39]:
     agesalarywork
    张三 20 10000 NaN
    李四 21 11000 python
    小昭 23 9900 python
    小郭 19 8500 python
    小齐 22 15000 NaN
    In [42]:
    df.loc['张三'] = np.nan
    df
    
    Out[42]:
     agesalarywork
    张三 NaN NaN NaN
    李四 21.0 11000.0 python
    小昭 23.0 9900.0 python
    小郭 19.0 8500.0 python
    小齐 22.0 15000.0 NaN
    In [43]:
    df.dropna(how='all')
    
    Out[43]:
     agesalarywork
    李四 21.0 11000.0 python
    小昭 23.0 9900.0 python
    小郭 19.0 8500.0 python
    小齐 22.0 15000.0 NaN
     

    (3) 填充函数 Series/DataFrame

    • fillna()
    In [47]:
    # 对多有的空数据进行替换
    df.fillna(value='Java')
    
    Out[47]:
     agesalarywork
    张三 Java Java Java
    李四 21 11000 python
    小昭 23 9900 python
    小郭 19 8500 python
    小齐 22 15000 Java
     

    可以选择前向填充还是后向填充

    In [49]:
    df.fillna(method='bfill')
    
    Out[49]:
     agesalarywork
    张三 21.0 11000.0 python
    李四 21.0 11000.0 python
    小昭 23.0 9900.0 python
    小郭 19.0 8500.0 python
    小齐 22.0 15000.0 NaN
    In [50]:
    df.fillna(method='ffill')
    
    Out[50]:
     agesalarywork
    张三 NaN NaN NaN
    李四 21.0 11000.0 python
    小昭 23.0 9900.0 python
    小郭 19.0 8500.0 python
    小齐 22.0 15000.0 python
     

    对于DataFrame来说,还要选择填充的轴axis。记住,对于DataFrame来说:

    • axis=0:index/行
    • axis=1:columns/列
    In [51]:
    #{'backfill', 'bfill', 'pad', 'ffill'
    df.fillna(method='ffill')
    
    Out[51]:
     agesalarywork
    张三 NaN NaN NaN
    李四 21.0 11000.0 python
    小昭 23.0 9900.0 python
    小郭 19.0 8500.0 python
    小齐 22.0 15000.0 python
    In [ ]:
     
     

    ============================================

    练习7:

    1. 简述None与NaN的区别

    2. 假设张三李四参加模拟考试,但张三因为突然想明白人生放弃了英语考试,因此记为None,请据此创建一个DataFrame,命名为ddd3

    3. 老师决定根据用数学的分数填充张三的英语成绩,如何实现? 用李四的英语成绩填充张三的英语成绩?

    ============================================

  • 相关阅读:
    第15周Leetcode记录
    《Redis深度历险》七(info指令和过期淘汰策略)
    第14周leetcode记录
    《Redis深度历险》六(事务+发布订阅+Stream)
    第13周LeetCode记录
    在Load average 高的情况下如何鉴别系统瓶颈
    Apache TraceEnable关闭与测试方法
    PHP 5.6 如何使用 CURL 上传文件
    转载-浅谈Ddos攻击攻击与防御
    基于SWOOLE的分布式SOCKET消息服务器架构
  • 原文地址:https://www.cnblogs.com/bilx/p/11527196.html
Copyright © 2020-2023  润新知