Python遍历pandas数据方法总结

作者:laozhang 时间:2022-04-23 05:47:58 

前言

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,pandas
0
投稿

猜你喜欢

  • python调用百度语音识别api

    2023-02-13 10:23:48
  • SQL Server 2012 安装与启动图文教程

    2024-01-27 08:33:35
  • Django利用cookie保存用户登录信息的简单实现方法

    2021-03-22 16:47:26
  • Python爬虫定时计划任务的几种常见方法(推荐)

    2021-06-02 02:05:39
  • golang中select语句的简单实例

    2023-09-03 03:01:28
  • Oracle 中文字段进行排序的sql语句

    2009-09-26 18:58:00
  • python flask项目打包成docker镜像发布的过程

    2021-06-28 17:38:21
  • python实现简单图片物体标注工具

    2021-09-07 21:31:50
  • Python字典删除键值对和元素的四种方法(小结)

    2021-06-12 22:58:24
  • python类中super()和__init__()的区别

    2021-04-17 16:03:02
  • 如何使用Python逆向抓取APP数据

    2022-03-12 11:03:41
  • Python Serial串口基本操作(收发数据)

    2022-04-17 09:54:07
  • django filters实现数据过滤的示例代码

    2023-11-20 03:59:22
  • python特效之字符成像详解

    2021-06-07 02:18:45
  • CSS样式表:详细介绍IE7新支持的选择器

    2007-10-09 18:24:00
  • Django 解决上传文件时,request.FILES为空的问题

    2021-10-21 19:37:41
  • JS对img标签进行优化使用onerror显示默认图像

    2024-04-10 10:51:35
  • Oracle数据表中的死锁情况解决方法

    2024-01-15 11:23:01
  • Pandas的AB BA类型数据框去重复

    2022-09-26 07:48:16
  • Matplotlib中rcParams使用方法

    2022-12-14 03:41:46
  • asp之家 网络编程 m.aspxhome.com