在Python中利用Pandas库处理大数据的简单介绍


Posted in Python onApril 07, 2015

在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章《别老扯什么Hadoop了,你的数据根本不够大》指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择。这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来处理数据:

    硬件环境
        CPU:3.5 GHz Intel Core i7
        内存:32 GB HDDR 3 1600 MHz
        硬盘:3 TB Fusion Drive
    数据分析工具
        Python:2.7.6
        Pandas:0.15.0
        IPython notebook:2.0.0

源数据如下表所示:

在Python中利用Pandas库处理大数据的简单介绍

数据读取

启动IPython notebook,加载pylab环境:

ipython notebook --pylab=inline

Pandas提供了IO工具可以将大文件分块读取,测试了一下性能,完整加载9800万条数据也只需要263秒左右,还是相当不错了。
 
import pandas as pd
reader = pd.read_csv('data/servicelogs', iterator=True)
try:
    df = reader.get_chunk(100000000)
except StopIteration:
    print "Iteration is stopped."

在Python中利用Pandas库处理大数据的简单介绍

使用不同分块大小来读取再调用 pandas.concat 连接DataFrame,chunkSize设置在1000万条左右速度优化比较明显。
 

loop = True
chunkSize = 100000
chunks = []
while loop:
  try:
    chunk = reader.get_chunk(chunkSize)
    chunks.append(chunk)
  except StopIteration:
    loop = False
    print "Iteration is stopped."
df = pd.concat(chunks, ignore_index=True)

下面是统计数据,Read Time是数据读取时间,Total Time是读取和Pandas进行concat操作的时间,根据数据总量来看,对5~50个DataFrame对象进行合并,性能表现比较好。

在Python中利用Pandas库处理大数据的简单介绍

在Python中利用Pandas库处理大数据的简单介绍

如果使用Spark提供的Python Shell,同样编写Pandas加载数据,时间会短25秒左右,看来Spark对Python的内存使用都有优化。
数据清洗

Pandas提供了 DataFrame.describe 方法查看数据摘要,包括数据查看(默认共输出首尾60行数据)和行列统计。由于源数据通常包含一些空值甚至空列,会影响数据分析的时间和效率,在预览了数据摘要后,需要对这些无效数据进行处理。

首先调用 DataFrame.isnull() 方法查看数据表中哪些为空值,与它相反的方法是 DataFrame.notnull() ,Pandas会将表中所有数据进行null计算,以True/False作为结果进行填充,如下图所示:

在Python中利用Pandas库处理大数据的简单介绍

Pandas的非空计算速度很快,9800万数据也只需要28.7秒。得到初步信息之后,可以对表中空列进行移除操作。尝试了按列名依次计算获取非空列,和 DataFrame.dropna() 两种方式,时间分别为367.0秒和345.3秒,但检查时发现 dropna() 之后所有的行都没有了,查了Pandas手册,原来不加参数的情况下, dropna() 会移除所有包含空值的行。如果只想移除全部为空值的列,需要加上 axis 和 how 两个参数:

df.dropna(axis=1, how='all')

共移除了14列中的6列,时间也只消耗了85.9秒。

接下来是处理剩余行中的空值,经过测试,在 DataFrame.replace() 中使用空字符串,要比默认的空值NaN节省一些空间;但对整个CSV文件来说,空列只是多存了一个“,”,所以移除的9800万 x 6列也只省下了200M的空间。进一步的数据清洗还是在移除无用数据和合并上。

对数据列的丢弃,除无效值和需求规定之外,一些表自身的冗余列也需要在这个环节清理,比如说表中的流水号是某两个字段拼接、类型描述等,通过对这些数据的丢弃,新的数据文件大小为4.73GB,足足减少了4.04G!

数据处理

使用 DataFrame.dtypes 可以查看每列的数据类型,Pandas默认可以读出int和float64,其它的都处理为object,需要转换格式的一般为日期时间。DataFrame.astype() 方法可对整个DataFrame或某一列进行数据格式转换,支持Python和NumPy的数据类型。

df['Name'] = df['Name'].astype(np.datetime64)

对数据聚合,我测试了 DataFrame.groupby 和 DataFrame.pivot_table 以及 pandas.merge ,groupby 9800万行 x 3列的时间为99秒,连接表为26秒,生成透视表的速度更快,仅需5秒。
 

df.groupby(['NO','TIME','SVID']).count() # 分组
fullData = pd.merge(df, trancodeData)[['NO','SVID','TIME','CLASS','TYPE']] # 连接
actions = fullData.pivot_table('SVID', columns='TYPE', aggfunc='count') # 透视表

根据透视表生成的交易/查询比例饼图:

在Python中利用Pandas库处理大数据的简单介绍

将日志时间加入透视表并输出每天的交易/查询比例图:
 

total_actions = fullData.pivot_table('SVID', index='TIME', columns='TYPE', aggfunc='count')
total_actions.plot(subplots=False, figsize=(18,6), kind='area')

在Python中利用Pandas库处理大数据的简单介绍

除此之外,Pandas提供的DataFrame查询统计功能速度表现也非常优秀,7秒以内就可以查询生成所有类型为交易的数据子表:

tranData = fullData[fullData['Type'] == 'Transaction']

该子表的大小为 [10250666 rows x 5 columns]。在此已经完成了数据处理的一些基本场景。实验结果足以说明,在非“>5TB”数据的情况下,Python的表现已经能让擅长使用统计分析语言的数据分析师游刃有余。

Python 相关文章推荐
python使用urllib模块开发的多线程豆瓣小站mp3下载器
Jan 16 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
详解django.contirb.auth-认证
Jul 16 Python
python从子线程中获得返回值的方法
Jan 30 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
Python如何实现强制数据类型转换
Nov 22 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
使用pyecharts1.7进行简单的可视化大全
May 17 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
详解Python中的join()函数的用法
Apr 07 #Python
Python中用于去除空格的三个函数的使用小结
Apr 07 #Python
简单介绍Python中的len()函数的使用
Apr 07 #Python
Python中endswith()函数的基本使用
Apr 07 #Python
举例详解Python中的split()函数的使用方法
Apr 07 #Python
Python中用startswith()函数判断字符串开头的教程
Apr 07 #Python
把MySQL表结构映射为Python中的对象的教程
Apr 07 #Python
You might like
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP 身份证号验证函数
2009/05/07 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
python数组过滤实现方法
2015/07/27 Python
Python中元组,列表,字典的区别
2017/05/21 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
python实现换位加密算法的示例
2018/10/14 Python
详解python的argpare和click模块小结
2019/03/31 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
毕业生个人求职的自我评价
2013/10/28 职场文书
机关作风建设自查报告
2014/10/22 职场文书
离婚起诉书范本
2015/05/18 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android