声明:此文只是对《对比excel,轻松学习python数据分析》这本书的读书笔记,文章中的代码均来源于书中,仅以知识分享为用途,后续我会继续支持作者,也会继续读完这本书,如有侵权,请留言我删除
另外,从此文开始,我把编辑器换为了jupyter notebook,不得不说,当我接触到这个工具的时候我真的是爱上了它,有了一种享受记录的感觉,当然工具也要用在专业的方向,至少在目前的数据分析来说,我觉得它相当完美
数据预处理
常见的不规整数据主要有缺失数据,重复数据,异常数据几种,在正式开始的数据分析之前,我们要把不规整的数据处理掉
缺失值处理
缺失值就是由某些原因导致部分数据为空,对于为空的这部分数据我们一般有两种处理方式
- (1)删除:即把含有缺失值的数据删除
- (2)填充:即把缺失的那部分数据用某个值代替
缺失值的查看
在Excel中我们先选中一列没有缺失值得数据,看一下这一列数据共有多少个,然后把其他列的计数与这一列进行对比,小于这一列数据的代表有缺失值,差值就是缺失个数
在python中直接调用info()方法就会返回每一列的缺失情况。关于info()在前面就用过,但是没有详细说明判断缺失值情况
import pandas as pd
# 在CSV文件中我已经把7月销量删除了一个值
df = pd.read_csv('train-pivot.csv', encoding='GBK')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 7 columns):
用户ID 6 non-null float64
客户分类 6 non-null object
区域 6 non-null object
是否省会 6 non-null object
7月销量 5 non-null float64
8月销量 6 non-null float64
9月销量 6 non-null float64
dtypes: float64(4), object(3)
memory usage: 520.0+ bytes
在Python中缺失值一般用NaN表示,从用info()方法的结果来看,7月销量这一列是5 non-null float64,表示这一列有5个非null值,而其他列有6个非null值,说明7月销量这一列有1个null值。
这里也可以用isnull()方法来判断哪个是缺失值,如果是缺失值返回Ture,如果不是缺失值则返回False
df = pd.read_csv('train-pivot.csv', encoding='GBK')
df.isnull()
用户ID | 客户分类 | 区域 | 是否省会 | 7月销量 | 8月销量 | 9月销量 | |
---|---|---|---|---|---|---|---|
0 | False | False | False | False | False | False | False |
1 | True | True | True | True | True | True | True |
2 | False | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False |
4 | False | False | False | False | True | False | False |
5 | False | False | False | False | False | False | False |
6 | False | False | False | False | False | False | False |
缺失值删除
缺失值分为两种:
- 一行中某个字段是缺失值
- 字段全部为缺失值,即为一个空白行
在Python中,利用dropna()方法,dropna()方法默认删除含有缺失值行,也就是只要某一行有缺失值就把这一行删除
df = pd.read_csv('train-pivot.csv', encoding='GBK')
df
用户ID | 客户分类 | 区域 | 是否省会 | 7月销量 | 8月销量 | 9月销量 | |
---|---|---|---|---|---|---|---|
0 | 59224.0 | A类 | 一线城市 | 是 | 6.0 | 20.0 | 0.0 |
1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | 55295.0 | B类 | 三线城市 | 否 | 37.0 | 27.0 | 35.0 |
3 | 46035.0 | A类 | 二线城市 | 是 | 8.0 | 1.0 | 8.0 |
4 | 2459.0 | C类 | 一线城市 | 是 | NaN | 8.0 | 14.0 |
5 | 22179.0 | B类 | 三线城市 | 否 | 9.0 | 12.0 | 4.0 |
6 | 22557.0 | A类 | 二线城市 | 是 | 42.0 | 20.0 | 55.0 |
df.dropna()
用户ID | 客户分类 | 区域 | 是否省会 | 7月销量 | 8月销量 | 9月销量 | |
---|---|---|---|---|---|---|---|
0 | 59224.0 | A类 | 一线城市 | 是 | 6.0 | 20.0 | 0.0 |
2 | 55295.0 | B类 | 三线城市 | 否 | 37.0 | 27.0 | 35.0 |
3 | 46035.0 | A类 | 二线城市 | 是 | 8.0 | 1.0 | 8.0 |
5 | 22179.0 | B类 | 三线城市 | 否 | 9.0 | 12.0 | 4.0 |
6 | 22557.0 | A类 | 二线城市 | 是 | 42.0 | 20.0 | 55.0 |
运行dropna()方法以后,删除含有NaN值得行,返回删除后的数据
如果想删除空白行,只要给dropna()方法传入一个参数 how='all’即可,这样就会删除那些全为空值得行,不全为空值得行就不会被删除
df
用户ID | 客户分类 | 区域 | 是否省会 | 7月销量 | 8月销量 | 9月销量 | |
---|---|---|---|---|---|---|---|
0 | 59224.0 | A类 | 一线城市 | 是 | 6.0 | 20.0 | 0.0 |
1 | NaN | NaN | NaN | NaN | NaN | NaN | N |