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
张三2010000NaN
李四2111000NaN
小昭239900NaN
小郭198500NaN
小齐2215000NaN
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
张三2010000NaN
李四2111000python
小昭239900python
小郭198500python
小齐2215000NaN
 

使用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
张三2010000NaN
小齐2215000NaN
In [33]:
# 保留非空数据 
# .all()判断轴中所有数据都不为空,返回True
s2 = df.notnull().all(axis=1) 
In [34]:
df[s2]
Out[34]:
 agesalarywork
李四2111000python
小昭239900python
小郭198500python
 

(2) 过滤函数

  • dropna()
 
可以选择过滤的是行还是列(默认为行)
In [38]:
df.dropna()
Out[38]:
 agesalarywork
李四2111000python
小昭239900python
小郭198500python
In [37]:
df.dropna(axis = 1) 
Out[37]:
 agesalary
张三2010000
李四2111000
小昭239900
小郭198500
小齐2215000
 
也可以选择过滤的方式 how = 'all',一行中所有数据为空才删除
In [39]:
df.dropna(how='all') 
Out[39]:
 agesalarywork
张三2010000NaN
李四2111000python
小昭239900python
小郭198500python
小齐2215000NaN
In [42]:
df.loc['张三'] = np.nan df 
Out[42]:
 agesalarywork
张三NaNNaNNaN
李四21.011000.0python
小昭23.09900.0python
小郭19.08500.0python
小齐22.015000.0NaN
In [43]:
df.dropna(how='all') 
Out[43]:
 agesalarywork
李四21.011000.0python
小昭23.09900.0python
小郭19.08500.0python
小齐22.015000.0NaN
 

(3) 填充函数 Series/DataFrame

  • fillna()
In [47]:
# 对多有的空数据进行替换
df.fillna(value='Java') 
Out[47]:
 agesalarywork
张三JavaJavaJava
李四2111000python
小昭239900python
小郭198500python
小齐2215000Java
 

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

In [49]:
df.fillna(method='bfill') 
Out[49]:
 agesalarywork
张三21.011000.0python
李四21.011000.0python
小昭23.09900.0python
小郭19.08500.0python
小齐22.015000.0NaN
In [50]:
df.fillna(method='ffill') 
Out[50]:
 agesalarywork
张三NaNNaNNaN
李四21.011000.0python
小昭23.09900.0python
小郭19.08500.0python
小齐22.015000.0python
 

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

  • axis=0:index/行
  • axis=1:columns/列
In [51]:
#{'backfill', 'bfill', 'pad', 'ffill'
df.fillna(method='ffill') 
Out[51]:
 agesalarywork
张三NaNNaNNaN
李四21.011000.0python
小昭23.09900.0python
小郭19.08500.0python
小齐22.015000.0python
In [ ]:
 
 

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

练习7:

  1. 简述None与NaN的区别

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

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

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

转载于:https://www.cnblogs.com/bilx/p/11527196.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值