Pandas 性能优化 - PANDAS教程

Pandas 性能优化

Pandas 是一个非常强大的数据分析工具,但当数据集变得庞大时,常常会遇到性能瓶颈。

为了提高 Pandas 在处理大规模数据时的效率,了解并应用一些性能优化技巧是非常必要的。

Pandas 性能优化涉及多个方面,包括数据类型优化、避免不必要的循环、使用向量化操作、优化索引以及分块加载大数据集等方法。

下面我们将详细介绍 Pandas 性能优化的几种方法。


使用适当的数据类型

Pandas 中的数据类型( dtype )直接影响内存使用和计算速度。合理选择数据类型可以显著减少内存占用和加速计算。

1. 使用适当的数值类型

Pandas 默认的数值类型是 int64 float64 ,但对于大部分数据,这可能会浪费内存。可以使用更小的类型,如 int8 , int16 , float32 等。

方法 说明
astype() 用于转换列的数据类型
downcast 将数据类型降级,例如将 int64 降级为 int32 int16
示例代码
importpandasaspd# 示例数据df=pd.DataFrame({'A':[100,200,300,400],'B':[1000,2000,3000,4000]})# 将列数据类型转换为较小的数据类型df['A']=df['A'].astype('int16')df['B']=df['B'].astype('int32')print(df.dtypes)

输出:


A    int16

B    int32

dtype: object

2. 对字符数据使用 category 类型

对于具有重复值的字符串列,可以使用 category 类型来减少内存消耗。 category 类型在内存中存储的是整数索引,而不是字符串本身。

示例代码
# 示例数据df=pd.DataFrame({'Category':['A','B','A','C','B','A']})# 使用 category 类型df['Category']=df['Category'].astype('category')print(df.dtypes)

输出:


Category    category

dtype: object


使用向量化操作而非循环

Pandas 的最大优势之一就是其能够利用向量化操作进行快速的批量运算。在 Pandas 中,尽量避免使用 Python 的原生循环,应该使用 Pandas 内置的函数,这样可以利用底层的优化进行快速计算。

示例代码
importpandasaspd# 示例数据df=pd.DataFrame({'A':[1,2,3,4],'B':[5,6,7,8]})# 使用向量化操作,避免使用循环df['C']=df['A']+ df['B']print(df)

输出:

   A  B  C

0  1  5  6

1  2  6  8

2  3  7  10

3  4  8  12

相较于逐行处理数据,使用 Pandas 的向量化操作可以显著提高运算速度。


3. 使用 apply() applymap() 优化

Pandas 提供了 apply() applymap() 方法,它们可以让你在数据框架中按行或按列应用函数,能够比循环更高效。

示例代码
# 使用 apply() 在列上应用自定义函数df['D']=df['A'].apply(lambdax: x **2)print(df)

输出:

   A  B   C   D

0  1  5   6   1

1  2  6   8   4

2  3  7  10   9

3  4  8  12  16

apply() 适用于处理一维数据, applymap() 则是对 DataFrame 中的每个元素应用函数,适用于二维数据。

示例代码
# 使用 applymap() 对 DataFrame 的每个元素应用函数df=df.applymap(lambdax: x *10)print(df)

输出:

    A   B   C   D

0  10  50  60  10

1  20  60  80  40

2  30  70 100  90

3  40  80 120 160

使用合适的索引

Pandas 的索引可以提高数据的查找速度,尤其是在需要进行多次查找或数据合并时,索引可以显著提升效率。对于大数据集,确保使用适当的索引并减少不必要的索引操作可以提高性能。

示例代码
# 创建索引并进行查找df=pd.DataFrame({'A':[1,2,3,4],'B':[5,6,7,8]})df.set_index('A',inplace=True)# 通过索引快速查找print(df.loc[2])

输出:

B    6

Name: 2, dtype: int64

使用分块加载大数据集

当数据集过大时,加载整个数据集会占用大量内存,甚至导致内存溢出。此时,可以通过分块读取数据来减小内存压力。

Pandas 提供了 chunksize 参数,允许在读取 CSV 或 Excel 文件时分块加载数据。

示例代码
# 分块读取 CSV 文件chunksize=10000forchunkinpd.read_csv('large_file.csv',chunksize=chunksize):# 对每个数据块进行处理process(chunk)