Python遍历pandas数据方法总结


Posted in Python onFebruary 09, 2018

前言

Pandas是python的一个数据分析包,提供了大量的快速便捷处理数据的函数和方法。其中Pandas定义了Series 和 DataFrame两种数据类型,这使数据操作变得更简单。Series 是一种一维的数据结构,类似于将列表数据值与索引值相结合。DataFrame 是一种二维的数据结构,接近于电子表格或者mysql数据库的形式。

Python遍历pandas数据方法总结

在数据分析中不可避免的涉及到对数据的遍历查询和处理,比如我们需要将dataframe两列数据两两相除,并将结果存储于一个新的列表中。本文通过该例程介绍对pandas数据遍历的几种方法。

for..in循环迭代方式

for语句是Python内置的迭代器工具,用于从可迭代容器对象(如列表、元组、字典、集合、文件等)中逐个读取元素,直到容器中没有更多元素为止,工具和对象之间只要遵循可迭代协议即可进行迭代操作。
具体的迭代的过程:可迭代对象通过__iter__方法返回迭代器,迭代器具有__next__方法,for循环不断地调用__next__方法,每次按序返回迭代器中的一个值,直到迭代到最后,没有更多元素时抛出异常StopIteration(python自动处理异常)。迭代的优点是无需把所有元素一次加载到内存中,可以在调用next方法时逐个返回元素,避免出现内存空间不够的情况。

>>> x = [1,2,3]
>>> its = x.__iter__() #列表是可迭代对象,否则会提示不是迭代对象
>>> its
<list_iterator object at 0x100f32198>
>>> next(its) # its包含此方法,说明its是迭代器
1
>>> next(its) 
2
>>>next(its) 
3
>>> next(its) 
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

Python遍历pandas数据方法总结

实现代码如下:

def haversine_looping(df):
disftance_list = []
for i in range(0,len(df)):
 disftance_list.append(df.iloc[i][‘high']/df.iloc[i][‘open'])
 return disftance_list

关于上述代码中range的实现方法,我们也可根据迭代器协议自实现相同功能的迭代器(自带iter方法和next方法)应用在for循环中,代码如下:

class MyRange:
 def __init__(self, num):
  self.i = 0
  self.num = num
 def __iter__(self):
  return self
 def __next__(self):
  if self.i < self.num:
  i = self.i
  self.i += 1
  return i
  else:
  raise StopIteration()
 for i in MyRange(10):
 print(i)

我们也可以通过列表解析的方式用更少的代码实现数据处理功能

disftance_list = [df.iloc[i][‘high']/df.iloc[i][‘open'] for i in range(0,len(df))]

iterrows()生成器方式

iterrows是对dataframe行进行迭代的一个生成器,它返回每行的索引及包含行本身的对象。所谓生成器其实是一种特殊的迭代器,内部支持了迭代器协议。Python中提供生成器函数和生成器表达式两种方式实现生成器,每次请求返回一个结果,不需要一次性构建一个结果列表,节省了内存空间。

生成器函数:编写为常规的def语句,但是使用yield语句一次返回一个结果,在每个结果之间挂起和继续它们的状态。

def gensquares(N):
 for i in range(N):
 yield i**2 
print gensquares(5)
for i in gensquares(5):
 print(i) 

<generator object gensquares at 0xb3d37fa4>
0
1
4
9
16

生成器表达式:类似列表解析,按需产生结果的一个对象。

print (x**2 for x in range(5))
print list(x**2 for x in range(5))
<generator object <genexpr> at 0xb3d31fa4>
[0, 1, 4, 9, 16]

iterrows()实现代码如下:

def haversine_looping(df):
disftance_list = []
for index,row in df.iterrows():
 disftance_list.append(row[‘high']/row[‘open'])
 return disftance_list

iterrows代码如下,yield语句挂起该函数并向调用者发送回一组值:

def iterrows(self):
 columns = self.columns
 klass = self._constructor_sliced
 for k, v in zip(self.index, self.values):
  s = klass(v, index=columns, name=k)
  yield k, s

apply()方法循环方式

apply()方法可将函数应用于dataframe特定行或列。函数由lambda方式在代码中内嵌实现,lambda函数的末尾包含axis参数,用来告知Pandas将函数运用于行(axis = 1)或者列(axis = 0)。

实现代码如下:

df.apply(lambda row: row[‘high']/row[‘open'], axis =1)

Pandas series 的矢量化方式

Pandas的DataFrame、series基础单元数据结构基于链表,因此可将函数在整个链表上进行矢量化操作,而不用按顺序执行每个值。Pandas包括了非常丰富的矢量化函数库,我们可把整个series(列)作为参数传递,对整个链表进行计算。

实现代码如下:

dftest4['rate'] = dftest4['high']/dftest4['open']

Numpy arrays的矢量化方式

由于函数的矢量化实现中只使用了series的数值,因此可使用values 方法将链表从Pandas series转换为NumPy arrays,把NumPy array作为参数传递,对整个链表进行计算。

实现代码如下:

dftest5['rate'] = dftest5['high'].values/dftest5['open'].values

总结

使用timeit方法对以上几种遍历方式进行执行时间测试,测试结果如下。可以看出循环执行的速度是最慢的,iterrows()针对Pandas的dataframe进行了优化,相比直接循环有显著提升。apply()方法也是在行之间进行循环,但由于利用了类似Cython的迭代器的一系列全局优化,其效率要比iterrows高很多。NumPy arrays的矢量化运行速度最快,其次是Pandas series矢量化。由于矢量化是同时作用于整个序列的,可以节省更多的时间,相比使用标量操作更好,NumPy使用预编译的C代码在底层进行优化,同时也避免了Pandas series操作过程中的很多开销,例如索引、数据类型等等,因此,NumPy arrays的操作要比Pandas series快得多。

Python 相关文章推荐
python打开url并按指定块读取网页内容的方法
Apr 29 Python
python如何发布自已pip项目的方法步骤
Oct 09 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
python实现批量文件重命名
Oct 31 Python
python序列化与数据持久化实例详解
Dec 20 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
使用matplotlib动态刷新指定曲线实例
Apr 23 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
七个Python必备的GUI库
Apr 27 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 Python
python中的闭包函数
Feb 09 #Python
基于Python socket的端口扫描程序实例代码
Feb 09 #Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 #Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 #Python
django数据库migrate失败的解决方法解析
Feb 08 #Python
python使用锁访问共享变量实例解析
Feb 08 #Python
Python异常对代码运行性能的影响实例解析
Feb 08 #Python
You might like
php学习之数据类型之间的转换代码
2011/05/29 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
详解Python发送email的三种方式
2018/10/18 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
python实现双色球随机选号
2020/01/01 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
优秀干部获奖感言
2014/01/31 职场文书
学校清明节活动总结
2014/07/04 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
MySQL 原理与优化之Update 优化
2022/08/14 MySQL