处理丢失数据

有两种丢失数据:

  • None
  • np.nan(NaN)
import numpy as np

type(None)
NoneType
type(np.nan)
float

1. None

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

object类型的运算要比int类型的运算慢得多

计算不同数据类型求和时间

%timeit np.arange(1e5,dtype=xxx).sum()

1E7
10000000.0
%timeit np.arange(1E6, dtype= int).sum()
4.85 ms ± 1.08 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.arange(1E6, dtype = float).sum()
7.33 ms ± 587 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.arange(1E6,dtype = object).sum()
118 ms ± 8.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

2. np.nan(NaN)

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

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

nd = np.array([10,20,30,np.nan,None])
#None 不能够参加到运算当中
nd.sum()
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-13-218f693fc17f> in <module>()
1 nd = np.array([10,20,30,np.nan,None])
----> 2 nd.sum() C:\anaconda\lib\site-packages\numpy\core\_methods.py in _sum(a, axis, dtype, out, keepdims)
30
31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32 return umr_sum(a, axis, dtype, out, keepdims)
33
34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False): TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'
nd = np.array([10,20,30,np.nan])
nd
array([10., 20., 30., nan])
nd.sum()
nan
np.mean(nd)
nan
np.nanmean(nd)
20.0
np.nansum(nd)
60.0
np.nan
nan

3. pandas中的None与NaN

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

创建DataFrame

import pandas as pd
from pandas import Series,DataFrame
df = DataFrame([10,20,57,None,np.nan], index = list('abcde'), columns = ["Python"])
df

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python
a 10.0
b 20.0
c 57.0
d NaN
e NaN
df.sum()
Python    87.0
dtype: float64
df = DataFrame([[10,20,57,None,np.nan],
[22,33,56,16,None],
[np.nan,1,2,3,4]], index = list("abc"), columns = ["Python","Java","物理","数学","H5"])
df

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20 57 NaN NaN
b 22.0 33 56 16.0 NaN
c NaN 1 2 3.0 4.0
df.sum(axis = 0)
Python     32.0
Java 54.0
物理 115.0
数学 19.0
H5 4.0
dtype: float64

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

df["Python"]["c"] = 12
C:\anaconda\lib\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.
df

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20 57 NaN NaN
b 22.0 33 56 16.0 NaN
c 12.0 1 2 3.0 4.0

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

df = DataFrame([[10,20,57,None,np.nan],
[22,33,56,16,None],
[np.nan,1,2,3,4]], index = list("abc"), columns = ["Python","Java","物理","数学","H5"])
df

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20 57 NaN NaN
b 22.0 33 56 16.0 NaN
c NaN 1 2 3.0 4.0
#下面讲的是一个重点!!!!
  • isnull()
  • notnull()
  • dropna(): 过滤丢失数据
  • fillna(): 填充丢失数据
df

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20 57 NaN NaN
b 22.0 33 56 16.0 NaN
c NaN 1 2 3.0 4.0
#DataFrame 的isnull这个函数返回值就是一个DataFrame
is_null = df.isnull()
is_null
#

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a False False False True True
b False False False False True
c True False False False False
#需求:查看哪一行有空值,举数据分析的例子的时候吗,会用这个方法
is_null = is_null.any(axis = 1)
is_null
a    True
b True
c True
dtype: bool
df2 = DataFrame([[10,20,57,90,28],[22,35,46,78,67],[21,34,23,77,66]],
index = list("efg"),columns = ["Python","Java","物理","数学","H5"] )
#没空值的数据
df2

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
e 10 20 57 90 28
f 22 35 46 78 67
g 21 34 23 77 66
df3 = df.add(df2, fill_value = 0)
df3

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN NaN
b 22.0 33.0 56.0 16.0 NaN
c NaN 1.0 2.0 3.0 4.0
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0
df3_isnull = df3.isnull()
df3_isnull = df3_isnull.any(axis = 1)
df3_isnull
a     True
b True
c True
e False
f False
g False
dtype: bool
df3[df3_isnull]
#过滤问题 过滤的是没有空值的,留下来的是带空值的!!!

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN NaN
b 22.0 33.0 56.0 16.0 NaN
c NaN 1.0 2.0 3.0 4.0
df

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20 57 NaN NaN
b 22.0 33 56 16.0 NaN
c NaN 1 2 3.0 4.0
df[is_null]

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20 57 NaN NaN
b 22.0 33 56 16.0 NaN
c NaN 1 2 3.0 4.0

(1)判断函数

  • isnull()
  • notnull()
df3

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN NaN
b 22.0 33.0 56.0 16.0 NaN
c NaN 1.0 2.0 3.0 4.0
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0
df3_notnull = df3.notnull().all(axis = 1)
df3_notnull
a    False
b False
c False
e True
f True
g True
dtype: bool
df3[df3_notnull]
#过滤的是空值,留下来的是没有空值的情况

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0
#还可以通过条件来进行过滤
df3

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN NaN
b 22.0 33.0 56.0 16.0 NaN
c NaN 1.0 2.0 3.0 4.0
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0
cond = (df3 >= 10).all(axis= 1)
cond
a    False
b False
c False
e True
f True
g True
dtype: bool
df3[cond]

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0

(2) 过滤函数

  • dropna()
df3

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN NaN
b 22.0 33.0 56.0 16.0 NaN
c NaN 1.0 2.0 3.0 4.0
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0
df3.dropna()

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
e 10.0 20.0 57.0 90.0 28.0
f 22.0 35.0 46.0 78.0 67.0
g 21.0 34.0 23.0 77.0 66.0
df3["H5"] = None
df3
#pandas 自身的bug 但是数据还是nan

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN None
b 22.0 33.0 56.0 16.0 None
c NaN 1.0 2.0 3.0 None
e 10.0 20.0 57.0 90.0 None
f 22.0 35.0 46.0 78.0 None
g 21.0 34.0 23.0 77.0 None
df3.dropna(axis = 1,how = "all")

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学
a 10.0 20.0 57.0 NaN
b 22.0 33.0 56.0 16.0
c NaN 1.0 2.0 3.0
e 10.0 20.0 57.0 90.0
f 22.0 35.0 46.0 78.0
g 21.0 34.0 23.0 77.0

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

也可以选择过滤的方式 how = 'all'

(3) 填充函数 Series/DataFrame

  • fillna()
df3

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN None
b 22.0 33.0 56.0 16.0 None
c NaN 1.0 2.0 3.0 None
e 10.0 20.0 57.0 90.0 None
f 22.0 35.0 46.0 78.0 None
g 21.0 34.0 23.0 77.0 None
df3.fillna(-1)

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 -1.0 -1
b 22.0 33.0 56.0 16.0 -1
c -1.0 1.0 2.0 3.0 -1
e 10.0 20.0 57.0 90.0 -1
f 22.0 35.0 46.0 78.0 -1
g 21.0 34.0 23.0 77.0 -1

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

df3

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN None
b 22.0 33.0 56.0 16.0 None
c NaN 1.0 2.0 3.0 None
e 10.0 20.0 57.0 90.0 None
f 22.0 35.0 46.0 78.0 None
g 21.0 34.0 23.0 77.0 None
df3.fillna(method = "bfill")

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 16.0 None
b 22.0 33.0 56.0 16.0 None
c 10.0 1.0 2.0 3.0 None
e 10.0 20.0 57.0 90.0 None
f 22.0 35.0 46.0 78.0 None
g 21.0 34.0 23.0 77.0 None
df3.fillna(method = "ffill")

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 NaN None
b 22.0 33.0 56.0 16.0 None
c 22.0 1.0 2.0 3.0 None
e 10.0 20.0 57.0 90.0 None
f 22.0 35.0 46.0 78.0 None
g 21.0 34.0 23.0 77.0 None
#f  forward  向前
df3.fillna(method='ffill', axis = 1)

.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
vertical-align: top;
} .dataframe thead th {
text-align: right;
}
Python Java 物理 数学 H5
a 10.0 20.0 57.0 57.0 57.0
b 22.0 33.0 56.0 16.0 16.0
c NaN 1.0 2.0 3.0 3.0
e 10.0 20.0 57.0 90.0 90.0
f 22.0 35.0 46.0 78.0 78.0
g 21.0 34.0 23.0 77.0 77.0
df3.fillna(method = "bfill",axis = 1)

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

  • axis=0:index/行
  • axis=1:columns/列

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

练习7:

  1. 简述None与NaN的区别

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

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

    用李四的英语成绩填充张三的英语成绩?

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

(二)pandas处理丢失数据的更多相关文章

  1. Pandas 处理丢失数据

    处理丢失数据 import pandas as pd from pandas import Series, DataFrame import numpy as np 有两种丢失数据: 1. None ...

  2. pandas处理丢失数据-【老鱼学pandas】

    假设我们的数据集中有缺失值,该如何进行处理呢? 丢弃缺失值的行或列 首先我们定义了数据集的缺失值: import pandas as pd import numpy as np dates = pd. ...

  3. Pandas处理丢失数据

    1.创建含NaN的矩阵 >>> dates = pd.date_range(', periods=6) >>> df = pd.DataFrame(np.arang ...

  4. [数据清洗]- Pandas 清洗“脏”数据(二)

    概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的.我们尝试去理解数据的列/行.记录.数据格式.语义错误.缺失的条目以及错误的 ...

  5. [数据清洗]- Pandas 清洗“脏”数据(三)

    预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容.具体步骤: 导入 Pandas 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径) D ...

  6. Python利用pandas处理Excel数据的应用

    Python利用pandas处理Excel数据的应用   最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...

  7. 【python基础】利用pandas处理Excel数据

    参考:https://www.cnblogs.com/liulinghua90/p/9935642.html 一.安装第三方库xlrd和pandas 1:pandas依赖处理Excel的xlrd模块, ...

  8. Python3 Pandas的DataFrame数据的增、删、改、查

    Python3 Pandas的DataFrame数据的增.删.改.查 一.DataFrame数据准备 增.删.改.查的方法有很多很多种,这里只展示出常用的几种. 参数inplace默认为False,只 ...

  9. pandas.DataFrame——pd数据框的简单认识、存csv文件

    接着前天的豆瓣书单信息爬取,这一篇文章看一下利用pandas完成对数据的存储. 回想一下我们当时在最后得到了六个列表:img_urls, titles, ratings, authors, detai ...

随机推荐

  1. 【Spring Cloud 系列】 二、Spring Cloud Eureka 的第一印象

    Eureka : 翻译翻译,找到了!(惊讶语气) Spring CLoud 中的 Spring Cloud Eureka,用于 分布式项目中的服务治理.是对Netflix 套件中的Eureka 的二次 ...

  2. 最通俗易懂的RSA加密解密指导

    前言 RSA加密算法是一种非对称加密算法,简单来说,就是加密时使用一个钥匙,解密时使用另一个钥匙. 因为加密的钥匙是公开的,所又称公钥,解密的钥匙是不公开的,所以称为私钥. 密钥 关于RSA加密有很多 ...

  3. Python三大器之生成器

    Python三大器之生成器 生成器初识 什么是生成器 生成器本身属于迭代器.继承了迭代器的特性,惰性求值,占用内存空间极小. 为什么要有生成器 我们想使用迭代器本身惰性求值的特点创建出一个可以容纳百万 ...

  4. ArrayList类的使用

    ArrayList常用类方法 (1)添加元素 public boolean add(E element) 在集合末端添加一个元素 public void add(int index,E element ...

  5. 入门大数据---通过Yarn搭建MapReduce和应用实例

    上一篇中我们了解了MapReduce和Yarn的基本概念,接下来带领大家搭建下Mapreduce-HA的框架. 结构图如下: 开始搭建: 一.配置环境 注:可以现在一台计算机上进行配置,然后分发给其它 ...

  6. 使用Apache Hudi构建大规模、事务性数据湖

    一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk 关于Nishith Agarwal更详细的介绍,主 ...

  7. socketserver模块使用与源码分析

    socketserver模块使用与源码分析 前言 在前面的学习中我们其实已经可以通过socket模块来建立我们的服务端,并且还介绍了关于TCP协议的粘包问题.但是还有一个非常大的问题就是我们所编写的S ...

  8. Kubernetes 中 搭建 EFK 日志搜索中心

    简介 Elastic 官方已经发布了Elasticsearch Operator ,简化了 elasticsearch 以及 kibana的部署与升级,结合 fluentd-kubernetes-da ...

  9. Docker入门——理解Docker的核心概念

    1 前言 相信不少人听过这么一句话: 人类的本质是复读机. 在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统.最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用 ...

  10. 【Spring注解驱动开发】如何使用@Value注解为bean的属性赋值,我们一起吊打面试官!

    写在前面 在之前的文章中,我们探讨了如何向Spring的IOC容器中注册bean组件,讲解了有关bean组件的生命周期的知识.今天,我们就来一起聊聊@Value注解的用法. 项目工程源码已经提交到Gi ...