python 数据清洗之数据合并、转换、过滤、排序


Posted in Python onFebruary 12, 2017

前面我们用pandas做了一些基本的操作,接下来进一步了解数据的操作,
数据清洗一直是数据分析中极为重要的一个环节。

数据合并

在pandas中可以通过merge对数据进行合并操作。

import numpy as np
import pandas as pd
data1 = pd.DataFrame({'level':['a','b','c','d'],
         'numeber':[1,3,5,7]})

data2=pd.DataFrame({'level':['a','b','c','e'],
         'numeber':[2,3,6,10]})
print(data1)

结果为:

python 数据清洗之数据合并、转换、过滤、排序

print(data2)

结果为:

python 数据清洗之数据合并、转换、过滤、排序

print(pd.merge(data1,data2))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

可以看到data1和data2中用于相同标签的字段显示,而其他字段则被舍弃,这相当于SQL中做inner join连接操作。
此外还有outer,ringt,left等连接方式,用关键词how的进行表示。

data3 = pd.DataFrame({'level1':['a','b','c','d'],
         'numeber1':[1,3,5,7]})
data4=pd.DataFrame({'level2':['a','b','c','e'],
         'numeber2':[2,3,6,10]})
print(pd.merge(data3,data4,left_on='level1',right_on='level2'))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

两个数据框中如果列名不同的情况下,我们可以通过指定letf_on 和right_on两个参数把数据连接在一起

print(pd.merge(data3,data4,left_on='level1',right_on='level2',how='left'))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

其他详细参数说明

python 数据清洗之数据合并、转换、过滤、排序

重叠数据合并

有时候我们会遇到重叠数据需要进行合并处理,此时可以用comebine_first函数。

data3 = pd.DataFrame({'level':['a','b','c','d'],
         'numeber1':[1,3,5,np.nan]})
 data4=pd.DataFrame({'level':['a','b','c','e'],
         'numeber2':[2,np.nan,6,10]})
 print(data3.combine_first(data4))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

可以看到相同标签下的内容优先显示data3的内容,如果一个数据框中的某一个数据是缺失的,此时另外一个数据框中的元素就会补上

这里的用法类似于np.where(isnull(a),b,a)

数据重塑和轴向旋转

这个内容我们在上一篇pandas文章有提到过。数据重塑主要使用reshape函数,旋转主要使用unstack和stack两个函数。

data=pd.DataFrame(np.arange(12).reshape(3,4),
       columns=['a','b','c','d'],
       index=['wang','li','zhang'])
print(data)

结果为:

python 数据清洗之数据合并、转换、过滤、排序

print(data.unstack())

结果为:

python 数据清洗之数据合并、转换、过滤、排序

数据转换

删除重复行数据

data=pd.DataFrame({'a':[1,3,3,4],
       'b':[1,3,3,5]})
print(data)

结果为:

python 数据清洗之数据合并、转换、过滤、排序

print(data.duplicated())

结果为:

python 数据清洗之数据合并、转换、过滤、排序

可以看出第三行是重复第二行的数据所以,显示结果为True

另外用drop_duplicates方法可以去除重复行

print(data.drop_duplicates())

结果为:
python 数据清洗之数据合并、转换、过滤、排序

替换值

除了使用我们上一篇文章中提到的fillna的方法外,还可以用replace方法,而且更简单快捷

data=pd.DataFrame({'a':[1,3,3,4],
       'b':[1,3,3,5]})
print(data.replace(1,2))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

多个数据一起换

print(data.replace([1,4],np.nan))

python 数据清洗之数据合并、转换、过滤、排序

数据分段

data=[11,15,18,20,25,26,27,24]
bins=[15,20,25]
print(data)
print(pd.cut(data,bins))

结果为:
[11, 15, 18, 20, 25, 26, 27, 24][NaN, NaN, (15, 20], (15, 20], (20, 25], NaN, NaN, (20, 25]]
Categories (2, object): [(15, 20] < (20, 25]]

可以看出分段后的结果,不在分段内的数据显示为na值,其他则显示数据所在的分段。

print(pd.cut(data,bins).labels)

结果为:

[-1 -1 0 0 1 -1 -1 1]

显示所在分段排序标签

print(pd.cut(data,bins).levels)

结果为:

Index([‘(15, 20]', ‘(20, 25]'], dtype='object')

显示所以分段标签

print(value_counts(pd.cut(data,bins)))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

显示每个分段值得个数

此外还有一个qcut的函数可以对数据进行4分位切割,用法和cut类似。

排列和采样

我们知道排序的方法有好几个,比如sort,order,rank等函数都能对数据进行排序
现在要说的这个是对数据进行随机排序(permutation)

data=np.random.permutation(5)
print(data)

结果为:

[1 0 4 2 3]

这里的peemutation函数对0-4的数据进行随机排序的结果。
也可以对数据进行采样

df=pd.DataFrame(np.arange(12).reshape(4,3))
samp=np.random.permutation(3)
print(df)

结果为:

python 数据清洗之数据合并、转换、过滤、排序

print(samp)

结果为:
[1 0 2]

print(df.take(samp))

结果为:

python 数据清洗之数据合并、转换、过滤、排序

这里使用take的结果是,按照samp的顺序从df中提取样本。

Python 相关文章推荐
Python中使用Boolean操作符做真值测试实例
Jan 30 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
TensorFlow Session会话控制&amp;Variable变量详解
Jul 30 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python输入多行字符串的方法总结
Jul 02 Python
使用Python制作表情包实现换脸功能
Jul 19 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
用python批量下载apk
Dec 29 Python
Django中session进行权限管理的使用
Jul 09 Python
python3制作捧腹网段子页爬虫
Feb 12 #Python
python日志记录模块实例及改进
Feb 12 #Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 #Python
使用Python绘制图表大全总结
Feb 11 #Python
Python 绘图和可视化详细介绍
Feb 11 #Python
Python实现多线程HTTP下载器示例
Feb 11 #Python
Python  pip安装lxml出错的问题解决办法
Feb 10 #Python
You might like
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
JavaScript继承方式实例
2010/10/29 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
Python之py2exe打包工具详解
2017/06/14 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
高三生物教学反思
2014/01/25 职场文书
国窖1573广告词
2014/03/21 职场文书
天地会口号
2014/06/17 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python