如何将Pandas迭代速度加快150倍?

本文探讨了如何优化Pandas的行迭代速度,对比了iterrows()和itertuples()方法。通过示例,揭示了itertuples()在处理大量数据时能显著提高效率,大约快了154倍,强调了在数据科学中优化迭代操作的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面对现实吧,Python的速度在与C语言或Go语言相比时,的确引发了不少口水战。

这让笔者一段时间以来,一直对Python快速处理任务的能力有所怀疑。

目前,笔者尝试在Go语言中进行数据科学研究——这是有可能的——但操作起来根本不像在Python中那样令人愉快,多半是由于语言的静态特性和数据科学大多是探索性领域。

并不是说用Go语言重写完成的解决方案不能提高性能,但这是另一篇文章的主题。

迄今为止,笔者至少忽略了Python可以更快地处理任务这一能力。笔者一直饱受目光短浅之苦——这是一种表现为当你只看到一种解决方案时,完全忽视其他方案的存在的综合征。相信出现这种情况的不只笔者自己。

这就是笔者今天想简要介绍如何令Pandas每日工作速度更快且更为愉悦的原因。更准确地说,该示例将关注行之间的迭代,并在过程中执行一些数据操作。因此,事不宜迟,一起进入正题。

做一个数据集

把观点论述清楚最简单的方法是声明一个单列数据框对象,其整数值范围为1到100000:

file

真的不需要任何更为复杂的东西来解决Pandas的速度问题。为验证一切进展顺利,以下是数据集的前几行和整体形状:

file

好了,准备工作已做足,现在一起看看如何遍历以及如何不遍历数据框的行。首先介绍如何不进行选择。

以下是你不应该做的事

啊,笔者一直在使用(和过度使用)如此多的iterrows()方法。它在默认情况下速度很慢,但你知道笔者费心去寻找替代方案的原因(目光短浅)。

为证明你不该使用iterrows()方法在数据框中进行遍历,笔者会做个快速演

### Pandas 使用技巧与最佳实践 #### 1. 数据类型的优化 选择合适的数据类型对于提升 Pandas 的性能至关重要。通过减少内存占用,可以加快计算速度并降低资源消耗。例如,在创建 DataFrame 或 Series 时,显式指定数据类型是一种常见做法[^1]。 ```python import pandas as pd # 显式设置数据类型以节省内存 data = {'column': range(1000)} df = pd.DataFrame(data, dtype='int8') # 将整数列设为 int8 类型 ``` #### 2. 向量化操作的应用 避免逐行迭代(如使用 `for` 循环),而是利用 Pandas 提供的内置函数或 NumPy 函数实现向量化操作。这不仅提高了代码可读性,还大幅提升了运行效率[^2]。 ```python # 不推荐的方式:逐行迭代 result = [] for value in df['column']: result.append(value * 2) # 推荐方式:向量化操作 df['new_column'] = df['column'] * 2 ``` #### 3. HDF5 数据交互的最佳实践 HDF5 是一种高效的二进制文件格式,适合存储大规模数值数据。Pandas 支持通过 `to_hdf()` 和 `read_hdf()` 方法与 HDF5 文件进行交互。为了进一步优化性能,可以选择压缩算法以及合理的存储模式[^3]。 - **压缩选项** 使用 GZIP 或 BLOSC 压缩技术能够有效减小文件体积。 ```python df.to_hdf('file.h5', key='data', mode='w', complib='blosc', complevel=9) ``` - **存储模式** 表格(Table)模式允许动态查询子集,而固定(Fixed)模式则更适合整体加载。 ```python # 存储为表格模式以便后续筛选 df.to_hdf('file_table.h5', key='data', format='table') # 动态查询特定条件下的数据 filtered_df = pd.read_hdf('file_table.h5', where=['column > 50']) ``` #### 4. 并行化处理大容量数据 当单线程无法满足需求时,可以通过多进程或多线程方法加速任务完成时间。Dask 是一个优秀的工具包,支持分布式计算环境中的 Pandas 风格 API。 ```python from dask import dataframe as dd ddf = dd.from_pandas(df, npartitions=4) # 划分多个分区 result = ddf.groupby('key').sum().compute() # 计算汇总统计量 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值