Pandas DataFrame 性能优化

Pandas DataFrame 性能优化

在本文中,我们将介绍如何优化 Pandas DataFrame 的性能,提高数据处理效率。由于 PandasPython 数据分析的核心库之一,优化 DataFrame 的性能对于数据科学家、数据工程师等领域的从业者来说是十分重要的。

阅读更多:Pandas 教程

选用正确的数据类型

Pandas 提供了多种数据类型,常见的有 object、int、float、datetime 等等。选用合适的数据类型可以避免不必要的内存开销,提高程序运行效率。

以一个示例 DataFrame 为例:

import pandas as pd

df = pd.DataFrame({
    'col1': ['a', 'b', 'c'],
    'col2': [1, 2, 3],
    'col3': [1.0, 2.0, 3.0]
})

print(df.dtypes)
Python

输出如下:

col1     object
col2      int64
col3    float64
dtype: object
Python

可以看到,Pandas 自动推断了每一列的数据类型。在实际应用中,我们可以通过以下方式将指定列的数据类型转换为合适的类型:

df['col1'] = df['col1'].astype('category')
df['col2'] = df['col2'].astype('int8')
df['col3'] = df['col3'].astype('float32')
Python

类别型数据可以减少空间开销,同时可以提高诸如透视表等操作的效率。在数据较大的情况下,这个优化的影响将变得特别明显。数值型数据同理。

处理空值

在 Pandas 中,空值通常由 NaN 表示。空值会影响计算机的内存和计算资源的占用,因此在数据处理时,我们需要对空值进行处理。

  • 删除空值

Pandas 提供了 dropna() 函数快速删除 DataFrame 中的空值。示例代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['a', 'b', np.NaN],
    'col2': [1, np.NaN, 3],
    'col3': [np.NaN, 2.0, 3.0]
})

df = df.dropna()

print(df)
Python

输出结果:

  col1  col2  col3
1    b   NaN   2.0
2  NaN   3.0   3.0
Python

通过调用 dropna() 函数,我们将空值所在的行删除。需要注意的是,dropna() 返回一个新的 DataFrame,因此需要使用 df = df.dropna() 的方式来更新原有的 DataFrame。

  • 填充空值

除了删除空值之外,我们还可以将空值进行填充。Pandas 提供了 fillna() 函数填充空值。示例代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['a', 'b', np.NaN],
    'col2': [1, np.NaN, 3],
    'col3': [np.NaN, 2.0, 3.0]
})

df = df.fillna(0)

print(df)
Python

输出结果如下:

  col1  col2  col3
0    a   1.0   0.0
1    b   0.0   2.0
2    0   3.0   3.0
Python

通过调用 fillna() 函数,我们将所有的空值填充为 0。需要注意的是,在填充空值时,我们要根据实际需求,选择合适的填充值,一味地填充为 0 并不一定总是合适的选择。

使用向量化运算

Pandas 提供了向量化运算,即对整个序列进行计算,而不是逐个元素进行计算。使用向量化运算可以避免在循环中进行重复的计算,提高计算效率。

举个例子,我们需要计算 DataFrame 中的每个元素与 10 的乘积。以下是传统的循环方式:

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': [4, 5, 6],
    'col3': [7, 8, 9]
})

for col in df.columns:
    for idx in df.index:
        df[col][idx] = df[col][idx] * 10

print(df)
Python

输出结果如下:

   col1  col2  col3
0    10    40    70
1    20    50    80
2    30    60    90
Python

以上循环代码虽然可以完成计算,但是效率低下。使用向量化运算可以大幅提高计算效率,以下是同样的计算方式:

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': [4, 5, 6],
    'col3': [7, 8, 9]
})

df = df * 10

print(df)
Python

输出结果同上:

   col1  col2  col3
0    10    40    70
1    20    50    80
2    30    60    90
Python

使用 Pandas 内置函数

Pandas 提供了许多内置函数,这些函数经过了优化和兼容性测试,具有很高的性能和可靠性,我们应该尽可能地使用这些内置函数。

以下是一些常用的内置函数:

  • value_counts():计算列中每个值的出现次数。
import pandas as pd

df = pd.DataFrame({
    'col1': ['a', 'a', 'b', 'c', 'c', 'c'],
    'col2': [1, 2, 3, 4, 4, 4],
    'col3': [5, 5, 5, 5, 6, 7]
})

print(df['col1'].value_counts())
Python

输出结果如下:

c    3
a    2
b    1
Name: col1, dtype: int64
Python
  • unique():计算列中唯一值的数量。
import pandas as pd

df = pd.DataFrame({
    'col1': ['a', 'a', 'b', 'c', 'c', 'c'],
    'col2': [1, 2, 3, 4, 4, 4],
    'col3': [5, 5, 5, 5, 6, 7]
})

print(df['col1'].unique())
Python

输出结果如下:

['a' 'b' 'c']
Python
  • isna() / notna():判断列中的元素是否为空值。
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['a', 'b', np.NaN],
    'col2': [1, np.NaN, 3],
    'col3': [np.NaN, 2.0, 3.0]
})

print(df['col2'].isna())
Python

输出结果如下:

0    False
1     True
2    False
Name: col2, dtype: bool
Python

以上只是一小部分 Pandas 内置函数,Pandas 官方文档中有更全面的介绍,大家可以参考官方文档使用对应的函数。

分块处理大数据集

当我们需要处理大型数据集时,可以将数据集分成若干个块来进行处理。这个方法称为分块处理。

以读取 CSV 文件为例,Pandas 提供了 read_csv() 函数,我们可以指定每个块的大小,读取指定数量的行,分块处理数据集。以下是分块处理的示例代码:

import pandas as pd

# 每个块的大小
chunk_size = 1000

# 读取 CSV 文件
csv_file = pd.read_csv('data.csv', chunksize=chunk_size)

for chunk in csv_file:
    # 在每个块中进行处理
    # ...
Python

以上是分块处理的基本思想,具体的处理方式可以根据实际需求进行选择。需要注意的是,在处理大型数据集时,内存的占用可能较大,需要进行谨慎操作。

使用更快的 Pandas 库

Pandas 是基于 NumPy 库构建的,NumPy 库提供了快速的数组操作方法。但是,Pandas 标准库在运算速度上相对较慢。

因此,有许多针对 Pandas 的扩展库,这些库提供了比标准库更快的计算方法。比如常见的 Pandas 扩展库:

  • Dask:面向大型数据集的并行计算库,提供类似于 Pandas DataFrame 的数据结构,可以实现分布式数据处理。

  • Modin:提供与 Pandas 基本相同的 API,但是运行速度更快,支持多线程和分布式计算。

  • CuDF:基于 GPU 的 Pandas 库,使用 NVIDIA 的 GPU 进行计算,速度比 CPU 快得多。

需要根据实际需求选择合适的扩展库,以提高运算速度。

总结

Pandas 是 Python 数据处理的重要库之一,通过优化代码,我们可以提高 DataFrame 的性能,加快计算速度。本文介绍了选用合适数据类型、处理空值、使用向量化运算、使用 Pandas 内置函数、分块处理大数据集、使用更快的 Pandas 库等优化 DataFrame 性能的方法。

在实际应用中,需要根据实际需求选择相应的优化方式,从而提高数据处理的效率。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程