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:\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]:
 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. 老师决定根据用数学的分数填充张三的英语成绩,如何实现? 用李四的英语成绩填充张三的英语成绩?

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

posted @ 2019-09-16 14:41  陪伴is最长情的告白  阅读(485)  评论(0编辑  收藏  举报