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

系统 1755 0

处理丢失数据

 

有两种丢失数据:

  • 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]:
  age salary work
张三 20 10000 NaN
李四 21 11000 NaN
小昭 23 9900 NaN
小郭 19 8500 NaN
小齐 22 15000 NaN
In [21]:
                    
                      df
                      
                        .
                        
                          work
                          
                            [
                            
                              '李四'
                              
                                :
                                
                                  '小郭'
                                  
                                    ] 
                                    
                                      = 
                                      
                                        'python' 
                                      
                                    
                                  
                                
                              
                            
                          
                        
                      
                    
                  
 
                    C:\Users\BLX\AppData\Roaming\Python\Python37\site-packages\ipykernel_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]:
  age salary work
张三 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]:
  age salary work
张三 20 10000 NaN
小齐 22 15000 NaN
In [33]:
                    
                      # 保留非空数据 

                      
                        # .all()判断轴中所有数据都不为空,返回True

                        
                          s2 
                          
                            = 
                            
                              df
                              
                                .
                                
                                  notnull
                                  
                                    ()
                                    
                                      .
                                      
                                        all
                                        
                                          (
                                          
                                            axis
                                            
                                              =
                                              
                                                1
                                                
                                                  ) 
                                                
                                              
                                            
                                          
                                        
                                      
                                    
                                  
                                
                              
                            
                          
                        
                      
                    
                  
In [34]:
                    
                      df
                      
                        [
                        
                          s2
                          
                            ]

                          
                        
                      
                    
                  
Out[34]:
  age salary work
李四 21 11000 python
小昭 23 9900 python
小郭 19 8500 python
 

(2) 过滤函数

  • dropna()
 

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

In [38]:
                    
                      df
                      
                        .
                        
                          dropna
                          
                            ()

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

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

In [39]:
                    
                      df
                      
                        .
                        
                          dropna
                          
                            (
                            
                              how
                              
                                =
                                
                                  'all'
                                  
                                    ) 
                                  
                                
                              
                            
                          
                        
                      
                    
                  
Out[39]:
  age salary work
张三 20 10000 NaN
李四 21 11000 python
小昭 23 9900 python
小郭 19 8500 python
小齐 22 15000 NaN
In [42]:
                    
                      df
                      
                        .
                        
                          loc
                          
                            [
                            
                              '张三'
                              
                                ] 
                                
                                  = 
                                  
                                    np
                                    
                                      .
                                      
                                        nan 
                                        
                                          df 
                                        
                                      
                                    
                                  
                                
                              
                            
                          
                        
                      
                    
                  
Out[42]:
  age salary work
张三 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]:
  age salary work
李四 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]:
  age salary work
张三 Java Java Java
李四 21 11000 python
小昭 23 9900 python
小郭 19 8500 python
小齐 22 15000 Java
 

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

In [49]:
                    
                      df
                      
                        .
                        
                          fillna
                          
                            (
                            
                              method
                              
                                =
                                
                                  'bfill'
                                  
                                    ) 
                                  
                                
                              
                            
                          
                        
                      
                    
                  
Out[49]:
  age salary work
张三 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]:
  age salary work
张三 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]:
  age salary work
张三 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. 老师决定根据用数学的分数填充张三的英语成绩,如何实现? 用李四的英语成绩填充张三的英语成绩?

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论