数据预处理

  • 5 数据预处理
    • 5.1 缺失值处理
      • 5.1.1 查看缺失值
        • Excel
        • Python
          • info()
          • isnull()
      • 5.1.2 删除缺失值所在行
        • Excel
        • Python
      • 5.1.3 替换缺失值
        • Excel
        • Python
    • 5.2 重复值处理
      • Excel
      • Python
    • 5.3 异常值处理
      • 5.3.1 检测异常值
      • 5.3.2 异常值处理
        • Excel
        • Python
    • 5.4 数据类型转换
      • 5.4.1 数据类型
        • Excel
        • Python
      • 5.4.2 数据类型转换
        • Excel
        • Python
    • 5.5 索引设置
      • 5.5.1 为无索引表添加索引
        • Excel
        • Python
      • 5.5.2 将某列设置为行索引
        • Excel
        • Python
      • 5.5.3 重命名索引
        • Excel
        • Python
      • 5.5.4 重置行索引
        • Excel
        • Python

5 数据预处理

在开始正式的数据分析前,我们需要对不合理的数据进行预先的处理。

常见的不合理数据有缺失数据、重复数据、异常数据等

5.1 缺失值处理

对于各种原因造成的缺失空值,一般有两种处理方式:

  • 把含有缺失值的整行数据删除
  • 将缺失值用其他值替换

5.1.1 查看缺失值

Excel

  • 可以选中一定完整的那一列查看数据个数作为基数 n n n,再依次其他列选中其他列得到数据个数 m m m,作差 n − m n-m n−m即可得到各列的缺失值个数。
  • 先选中一块大区域,Ctrl+g调出"定位"窗口,打开"定位条件",选择"空值",即可选中该区域内的所有空值。

Python

在Pandas中,"NaN"代表数字型空值

info()
df_obj.info()

之前我们利用这个方法来查看字段的数据类型,但它也能显示出空值的信息。

如:

grades_df.info()
"""
<class 'pandas.core.frame.DataFrame'>
Index: 18 entries, 包宏伟 to 张桂花
Data columns (total 11 columns):#   Column  Non-Null Count  Dtype
---  ------  --------------  -----  0   学号      18 non-null     int64  1   班级      18 non-null     object 2   语文      18 non-null     float643   数学      16 non-null     float644   英语      18 non-null     int64  5   生物      17 non-null     float646   地理      18 non-null     int64  7   历史      18 non-null     int64  8   政治      18 non-null     int64  9   总分      18 non-null     float6410  平均分     18 non-null     float64
dtypes: float64(5), int64(5), object(1)
memory usage: 1.7+ KB
"""#18个行索引,第3列16个非空值(non-null),第5列有17个非空值,说明第3列有18-16=2个缺失值,第5列有18-17=1个缺失值
isnull()
df_obj.isnull()
  • 返回bool类型的表格,True代表为缺失空值
  • 返回一个DataFrame对象

如:

print(grades_df.isnull())
"""学号     班级     语文     数学     英语     生物     地理     历史     政治     总分  \
姓名
包宏伟  False  False  False  False  False  False  False  False  False  False
陈万地  False  False  False  False  False  False  False  False  False  False
杜学江  False  False  False  False  False  False  False  False  False  False
符合   False  False  False  False  False   True  False  False  False  False
吉祥   False  False  False   True  False  False  False  False  False  False
李北大  False  False  False  False  False  False  False  False  False  False
李娜娜  False  False  False  False  False  False  False  False  False  False
刘康锋  False  False  False  False  False  False  False  False  False  False
刘鹏举  False  False  False   True  False  False  False  False  False  False
倪冬声  False  False  False  False  False  False  False  False  False  False
齐飞扬  False  False  False  False  False  False  False  False  False  False
苏解放  False  False  False  False  False  False  False  False  False  False
孙玉敏  False  False  False  False  False  False  False  False  False  False
王清华  False  False  False  False  False  False  False  False  False  False
谢如康  False  False  False  False  False  False  False  False  False  False
闫朝霞  False  False  False  False  False  False  False  False  False  False
曾令煊  False  False  False  False  False  False  False  False  False  False
张桂花  False  False  False  False  False  False  False  False  False  False   平均分
姓名
包宏伟  False
陈万地  False
杜学江  False
符合   False
吉祥   False
李北大  False
李娜娜  False
刘康锋  False
刘鹏举  False
倪冬声  False
齐飞扬  False
苏解放  False
孙玉敏  False
王清华  False
谢如康  False
闫朝霞  False
曾令煊  False
张桂花  False
"""

5.1.2 删除缺失值所在行

Excel

选中缺失值后,右键选择"删除"–>“整行”

Python

df_obj.dropna(axis: 'Axis' = 0,how: 'str' = 'any',inplace: 'bool' = False,
)
  • axis设置删除的是行还是列。为0代表行,为1代表列。默认为列。
  • how设置删除条件。为"any"代表只要本行/列出现空值就删除。为"all"代表只有本行全为空值才删除。默认为"any"
  • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

如:

df = pd.DataFrame([["张三", 18, 120],[None, None, 130],[None, None, None], ["李四", 17, 100] ],index=[1, 2, 3, 4],columns=['姓名', '年龄', '得分'])print(df)
"""姓名    年龄     得分
1    张三  18.0  120.0
2  None   NaN  130.0
3  None   NaN    NaN
4    李四  17.0  100.0
"""new_df1=df.dropna(how="all")
print(new_df1)
"""姓名    年龄     得分
1    张三  18.0  120.0
2  None   NaN  130.0
4    李四  17.0  100.0
"""new_df2=df.dropna(how="any")
print(new_df2)
"""姓名    年龄     得分
1  张三  18.0  120.0
4  李四  17.0  100.0
"""print(df)     # 以上操作默认在返回的新表中操作,不会影响原表
"""姓名    年龄     得分
1    张三  18.0  120.0
2  None   NaN  130.0
3  None   NaN    NaN
4    李四  17.0  100.0
"""

5.1.3 替换缺失值

当缺失值占整行数据少于 30 % 30\% 30%时,我们可以考虑把缺失值替换成其他值。

Excel

通过"定位条件"选中所有空值后,在第一个空值中输入要替换成的目标值(常用0、众数、平均数、相邻数据等),Ctrl+Enter ,即可替换所有空值。

Python

df.fillna(value: 'object | ArrayLike | None' = None,method: 'FillnaOptions | None' = None,axis: 'Axis | None' = None,inplace: 'bool' = False,)
  • value设置替换值。可以传入单个替换值。也可以传入key为行/列索引,value为该行/列的替换值组成的字典。

  • method设置可选的替换方式。padffill为上一个非空值。backfillbfill为下一个非空值。

  • axis设置替换的单位是行还是列。为0代表行,为1代表列。默认为列。

  • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

如:

df = pd.DataFrame([["张三", 18, 120],[None, None, 130],[None, None, None], ["李四", 17, 100] ],index=[1, 2, 3, 4],columns=['姓名', '年龄', '得分'])new_df1=df.fillna(0)
print(new_df1)
"""姓名    年龄     得分
1  张三  18.0  120.0
2   0   0.0  130.0
3   0   0.0    0.0
4  李四  17.0  100.0
"""new_df2=df.fillna({"姓名":"佚名","年龄":18,"得分":0})
print(new_df2)
"""姓名    年龄     得分
1  张三  18.0  120.0
2  佚名  18.0  130.0
3  佚名  18.0    0.0
4  李四  17.0  100.0
"""

5.2 重复值处理

重复值一般直接删除。

Excel

选中表格区域,在菜单栏依次选择"数据">“数据工具">“删除重复值”,勾选想要检测重复值的列。只要这些选中的列数据全部相同,就会删除重复行,只留下一个。

Python

df.drop_duplicates(subset: 'Hashable | Sequence[Hashable] | None' = None,keep: "Literal['first'] | Literal['last'] | Literal[False]" = 'first',inplace: 'bool' = False,ignore_index: 'bool' = False)
  • subset设置想要检测重复值的列。可以传入一个列表。默认为所有列。
  • keep设置保留的数据的位置。'first'代表第一个,'last'代表最后一个,None代表一个都不留。
  • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False
  • ignore_index设置是否重新设置默认索引(从0开始的整数)。False代表不重新设置,True代表重新设置。

如:

df = pd.DataFrame([["张三", 18, 120], ["张三", 18, 120], ["张三", 17, 130],["李四", 17, 120], ["李四", 17, 100]],index=[1, 2, 3, 4, 5],columns=['姓名', '年龄', '得分'])new_df1=df.drop_duplicates()
print(new_df1)
"""姓名  年龄   得分
1  张三  18  120
3  张三  17  130
4  李四  17  120
5  李四  17  100
"""new_df2=df.drop_duplicates(subset=['姓名','年龄'])
print(new_df2)
"""
1  张三  18  120
3  张三  17  130
4  李四  17  120
"""new_df3=df.drop_duplicates(ignore_index=True)
print(new_df3)
"""姓名  年龄   得分
0  张三  18  120
1  张三  17  130
2  李四  17  120
3  李四  17  100
"""

5.3 异常值处理

异常值指非正常数据,要么过高,要么过低,总之不符合实际。

5.3.1 检测异常值

检测异常值的常用策略:

  • 划定正常范围,不在该范围内视为异常值
  • 绘制箱形图(16章详述)
  • 如果数据符合正态分布,可以将 ( μ − 3 σ , μ + 3 σ ) (\mu-3\sigma,\mu+3\sigma) (μ−3σ,μ+3σ) 范围之外的数据视为异常值。( μ \mu μ为平均值, σ \sigma σ为标准差)

5.3.2 异常值处理

处理异常值的常用策略:

  • 直接删除
  • 当做缺失值,进行另外填充
  • 对异常值进行特别的研究,探寻异常值出现的原因

Excel

  • 直接删除:通过"筛选"功能得到异常值,选中,右键"删除行"
  • 填充:通过"筛选"功能得到异常值,选中,替换为其他值

Python

  • 直接删除:通过bool条件过滤掉异常值,得到新的DataFrame表对象
  • 填充:replace方法

其他章节详述

5.4 数据类型转换

5.4.1 数据类型

Excel

选中某一列,在"数字"栏中可查看其数据类型:

Python

Pandas的主要数据类型有以下几种:

  • 字符串类型:object(还可表示混合类型)
  • 整数类型:Int64,Int32,Int16, Int8
  • 无符号整数:UInt64,UInt32,UInt16, UInt8
  • 浮点数类型:float64,float32
  • 日期和时间类型:datetime64[ns]、datetime64[ns, tz]、timedelta[ns]
  • 布尔类型:bool

可以使用前面介绍过的info()方法来查看整个表的数据类型及其他信息,还可以通过dtypes属性只获取整个表的数据类型,列的dtype属性获取特定列的数据类型。

df.dtypes
df[列索引].dtype

如:

df = pd.DataFrame({"学科": ["数学分析", "高等代数", "解析几何"],"学期": [3, 2, 1],"学分": [18, 12, 4],"是否必修": [True, True, False]},index=range(1, 4))print(df["学科"].dtype)
print(df["学期"].dtype)
print(df["学分"].dtype)
print(df["是否必修"].dtype)"""
object
int64
int64
bool
"""print(df.dtypes)
"""
学科      object
学期       int64
学分       int64
是否必修      bool
dtype: object
"""

5.4.2 数据类型转换

不同的数据类型能进行的操作不同。为了满足需求,需要将数据强制转换为正确的类型。

Excel

选中某列,同样在"数字"栏,点击类型完成转换。有时可以看到明显的格式变化。

Python

df.astype(dtype, copy: 'bool_t' = True, errors: 'str' = 'raise')
  • dtype可以传入字典,key为列索引,value为转化的目标类型
  • copy设置是否复制,即不在原表上操作,返回新表,默认为True
  • errors设置转化失败后的行为。'raise'为报错,'ignore'为忽视。默认'raise'

如:

new_df=df.astype({"学期":"object","学分":"float64"})print(df.dtypes)
"""
学科      object
学期       int64
学分       int64
是否必修      bool
dtype: object
"""print(new_df.dtypes)
"""
学科       object
学期       object
学分      float64
是否必修       bool
dtype: object
"""

5.5 索引设置

5.5.1 为无索引表添加索引

Excel

在表的第一行上方插入新的一行,在表的第一列左方插入新的一列。

选中第一行/第一列,右击"插入>整行/整列"

在新行新列中添加索引

Python

DataFrame对象默认以0开始的整数数列为索引。

可以通过index属性修改行索引,columns属性修改列索引。

df.index=[...]
df.columns=[...]

如:

df = pd.DataFrame([["a", "A"], ["b", "B"], ["c", "C"]])
print(df)
"""0  1
0  a  A
1  b  B
2  c  C
"""df.index = range(1, 4)
df.columns = ["小写", "大写"]
print(df)
"""小写 大写
1  a  A
2  b  B
3  c  C
"""

5.5.2 将某列设置为行索引

Excel

将该列拖动到第一列即可

Python

df.set_index(keys,drop: 'bool' = True,inplace: 'bool' = False)
  • key可为单个列索引,或列索引列表(称为层次化索引)
  • drop设置是否删除表中的该列,仅将其设为索引。默认为True
  • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

如:

df = pd.DataFrame({"商品名称": ["苹果", "梨", "手机", "电脑", "玩偶", "玩具汽车"],"商品种类": ["食品", "食品", "电子产品", "电子产品", "玩具", "玩具"],"商品编号": [1, 2, 1, 2, 1, 2],"商品单价": [2, 3, 4000, 5000, 100, 200]
})print(df)
"""商品名称  商品种类  商品编号  商品单价
0    苹果    食品     1     2
1     梨    食品     2     3
2    手机  电子产品     1  4000
3    电脑  电子产品     2  5000
4    玩偶    玩具     1   100
5  玩具汽车    玩具     2   200
"""new_df1 = df.set_index("商品编号")
print(new_df1)
"""商品种类  商品编号  商品单价
商品名称
苹果      食品     1     2
梨       食品     2     3
手机    电子产品     1  4000
电脑    电子产品     2  5000
玩偶      玩具     1   100
玩具汽车    玩具     2   200
"""new_df2 = df.set_index(["商品种类", "商品编号"])
print(new_df2)
"""商品名称  商品单价
商品种类 商品编号
食品   1       苹果     22        梨     3
电子产品 1       手机  40002       电脑  5000
玩具   1       玩偶   1002     玩具汽车   200
"""

层次化索引可实现多维表格

5.5.3 重命名索引

Excel

直接修改索引名即可。

Python

df.rename(index: 'Renamer | None' = None,columns: 'Renamer | None' = None,inplace: 'bool' = False,errors: 'str' = 'ignore',)
  • index设置行索引命名的过程。可以传入字典,key为旧索引名,value为新索引名。
  • columns设置列索引命名的过程。可以传入字典,key为旧索引名,value为新索引名。
  • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False
  • errors设置转化失败后的行为。'raise'为报错,'ignore'为忽视。默认'raise'

如:

new_df3=df.rename(columns={"商品名称":"名称","商品种类":"种类","商品编号":"编号"},index={0:6})
print(new_df3)
"""名称    种类  编号  商品单价
6    苹果    食品   1     2
1     梨    食品   2     3
2    手机  电子产品   1  4000
3    电脑  电子产品   2  5000
4    玩偶    玩具   1   100
5  玩具汽车    玩具   2   200
"""

5.5.4 重置行索引

将行索引恢复为列

Excel

如果是一列的行索引,直接拖动离开第一列即可。

如果是层次化索引,复制、粘贴、删除以恢复

Python

df.reset_index(level: 'Hashable | Sequence[Hashable] | None' = None,drop: 'bool' = False,inplace: 'bool' = False)
  • level设置要恢复的行索引对应的列。默认所有层全部恢复。可指定层数(0开始)或列名。
  • drop设置是否删除对应索引,不把它恢复成数据列。默认为False
  • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

如:

new_df4=new_df2.reset_index(level=1)
print(new_df4)
"""商品编号  商品名称  商品单价
商品种类
食品       1    苹果     2
食品       2     梨     3
电子产品     1    手机  4000
电子产品     2    电脑  5000
玩具       1    玩偶   100
玩具       2  玩具汽车   200
"""new_df5=new_df2.reset_index(level="商品编号")
print(new_df5)
"""商品种类  商品名称  商品单价
商品编号
1       食品    苹果     2
2       食品     梨     3
1     电子产品    手机  4000
2     电子产品    电脑  5000
1       玩具    玩偶   100
2       玩具  玩具汽车   200
"""new_df6=new_df2.reset_index()
print(new_df6)
"""商品种类  商品编号  商品名称  商品单价
0    食品     1    苹果     2
1    食品     2     梨     3
2  电子产品     1    手机  4000
3  电子产品     2    电脑  5000
4    玩具     1    玩偶   100
5    玩具     2  玩具汽车   200
"""

reset_index()方法常用于数据分组、数据透视表中


《对比Excel,轻松学习Python数据分析》读书笔记------数据预处理相关推荐

  1. 『对比Excel,轻松学习Python数据分析』新书发布

    之前在公众号提过,我写了一本书,现在这本书终于面世了,这本书就是『对比Excel,轻松学习Python数据分析』,这本书是写什么的,以及这本书怎么写的,相信大家通过书名就能了解一二,但还是有必要专门写 ...

  2. python和excel的区别-对比Excel,轻松学习Python数据分析

    阅读权限50威望2 级论坛币2119 个学术水平357 点热心指数383 点信用等级313 点经验103301 点帖子917精华在线时间8677 小时注册时间2012-3-28最后登录2020-10- ...

  3. 好书推荐:《对比Excel,轻松学习Python数据分析》

    之前就一直有打算出一个结合Excel的Python数据分析的教程,刚好张俊红同学就出了书籍,后面写相关文章又多了一本好书.我首先说说我的看法,为什么要和Excel做结合了. Excel大家都熟悉,结合 ...

  4. 怎么学python-如何轻松学习Python数据分析

    1.实际的工作 如果你是一名数据分析师,我相信你对上面的这些词应该不陌生.我自己在刚开始做数据分析的时候,基本上每天就是Excel,就是Excel里面的vlookup.sumifs.数据透视表这些,s ...

  5. 如何轻松学习Python数据分析?

    总第135篇/张俊红 今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该如何学习才能做到毫不费 ...

  6. 学python处理数据_如何轻松学习Python数据分析?

    原标题:如何轻松学习Python数据分析? 今天这篇文章来聊聊如何轻松学习『Python数据分析』,我会以一个数据分析师的角度去聊聊做数据分析到底有没有必要学习编程.学习Python,如果有必要,又该 ...

  7. Python数据分析中的数据预处理:数据标准化

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python数据分析中的 数据预处理:数据标准化 ● 选择题 以下关于 ...

  8. 《对比Excel,轻松学习Python数据分析》读书笔记------数据运算

    数据运算 8 数据运算 8.1 算术运算 Excel Python 8.2 比较运算 Excel Python 8.3 汇总运算 8.3.1 计算总个数count Excel Python 8.3.2 ...

  9. 《对比excel,轻松学习python数据分析》学习笔记

    文章目录 前言 为什么要学习python 为什么要对比excel学习python 第1章 数据分析基础 数据分析的作用 数据分析的内容 数据分析的流程 第2章 python基础知识 1.python介 ...

最新文章

  1. VIM 多行注释与取消
  2. php 编程风格,PHP程序员的自我修炼:PHP编程风格_PHP教程
  3. csdn颜色字体的改变
  4. linux中创建目录树,如何在C++/Linux中创建目录树?
  5. Vue系列Vue-cli 4配置别名(六)
  6. 计算机辅助设计的概念.doc,计算机辅助设计的基础知识.DOC
  7. 洛谷P3698 [CQOI2017]小Q的棋盘
  8. java购物系统需求分析_java网上购物系统需求分析报告.doc
  9. 自由软件之“父”—Richard. M. Stallman
  10. mysql 大文本_MySQL长文本存储类型
  11. Springboot之苹果内购支付
  12. android 充电模式deamon_它是首款无线充电手机,也是雷军十年前的最爱极客博物馆...
  13. c语言魔方阵难不难,C语言魔方阵问题
  14. 大数据技术之Hive 第4章 DDL数据定义语言
  15. mysql 高并发的解决方案
  16. MATLAB 批量改文件后缀
  17. 用UDP实现简易的聊天室
  18. echart各个柱体设置不同颜色
  19. 求最大值(求最大值)
  20. 直流电机电压调速器设计

热门文章

  1. 小心 MSHTA漏洞为黑客大开远程控制之门
  2. 如何用python免费看美剧
  3. 利用一个完全安全的C#文件下载远程木马到内存进行执行
  4. 杭州奇侠互动网络科技游戏测试笔试题
  5. 淘身边VS淘宝跳蚤街: 官方和第三方的基情之战
  6. JS小型游戏框架coquette学习(持续更新)
  7. 天涯社区是怎样一步步被人遗忘的?
  8. JavaWeb实现自动登录
  9. 在HTML中rotate属性,CSS 图片的旋转rotate旋转属性(一)
  10. 甲肝、乙肝、丙肝----肝、肝、肝!