📢 转载信息
原文链接:https://www.kdnuggets.com/5-lightweight-alternatives-to-pandas-you-should-try
原文作者:Kanwal Mehreen
Image by Author
# 引言
开发者通常使用 pandas 进行数据操作,但它在处理大型数据集时可能会很慢。正因如此,许多人正在寻找更快、更轻量的替代方案。这些替代方案保留了分析所需的核心功能,同时侧重于速度、更低的内存使用率和简洁性。在本文中,我们将探讨你可以尝试的五种轻量级 pandas 替代品。
# 1. DuckDB
DuckDB 相当于分析领域的 SQLite。你可以直接对逗号分隔值(CSV)文件运行 SQL 查询。如果你熟悉 SQL 或在机器学习管道中工作,它会非常有用。使用以下命令安装:
pip install duckdb
我们将使用泰坦尼克号(Titanic)数据集并对其运行一个简单的 SQL 查询,如下所示:
import duckdb
url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
# 在 CSV 上运行 SQL 查询
result = duckdb.query(f""" SELECT sex, age, survived FROM read_csv_auto('{url}') WHERE age > 18 """).to_df()
print(result.head())
输出:
sex age survived 0 male 22.0 0 1 female 38.0 1 2 female 26.0 1 3 female 35.0 1 4 male 35.0 0
DuckDB 直接在 CSV 文件上运行 SQL 查询,然后将输出转换为 DataFrame。你可以在获得 Python 灵活性的同时享受 SQL 的速度。
# 2. Polars
Polars 是当今最流行的数据库之一。它使用 Rust 语言实现,速度极快且内存占用极少。其语法也非常简洁。我们使用 pip 来安装它:
pip install polars
现在,让我们使用泰坦尼克号数据集来看一个简单的例子:
import polars as pl
# 加载数据集
url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
df = pl.read_csv(url)
result = df.filter(pl.col("age") > 40).select(["sex", "age", "survived"])
print(result)
输出:
shape: (150, 3)
┌────────┬──────┬──────────┐
│ sex ┆ age ┆ survived │
│ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ i64 │
╞════════╪══════╪══════════╡
│ male ┆ 54.0 ┆ 0 │
│ female ┆ 58.0 ┆ 1 │
│ female ┆ 55.0 ┆ 1 │
│ male ┆ 66.0 ┆ 0 │
│ male ┆ 42.0 ┆ 0 │
│ … ┆ … ┆ … │
│ female ┆ 48.0 ┆ 1 │
│ female ┆ 42.0 ┆ 1 │
│ female ┆ 47.0 ┆ 1 │
│ male ┆ 47.0 ┆ 0 │
│ female ┆ 56.0 ┆ 1 │
└────────┴──────┴──────────┘
Polars 读取 CSV 文件,根据年龄条件过滤行,并选择一部分列。
# 3. PyArrow
PyArrow 是一个用于列式数据的轻量级库。像 Polars 这样的工具使用 Apache Arrow 来提高速度和内存效率。它不能完全替代 pandas,但在读取文件和预处理方面表现出色。使用以下命令安装:
pip install pyarrow
在我们的示例中,让我们使用 Iris(鸢尾花)数据集的 CSV 格式,如下所示:
import pyarrow.csv as csv
import pyarrow.compute as pc
import urllib.request
# 下载 Iris CSV
url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv"
local_file = "iris.csv"
urllib.request.urlretrieve(url, local_file)
# 使用 PyArrow 读取
table = csv.read_csv(local_file)
# 过滤行
filtered = table.filter(pc.greater(table['sepal_length'], 5.0))
print(filtered.slice(0, 5))
输出:
pyarrow.Table
sepal_length: double
sepal_width: double
petal_length: double
petal_width: double
species: string
----
sepal_length: [[5.1,5.4,5.4,5.8,5.7]]
sepal_width: [[3.5,3.9,3.7,4,4.4]]
petal_length: [[1.4,1.7,1.5,1.2,1.5]]
petal_width: [[0.2,0.4,0.2,0.2,0.4]]
species: [["setosa","setosa","setosa","setosa","setosa"]]
PyArrow 读取 CSV 文件并将其转换为列式格式。每列的名称和类型都以清晰的架构列出。这种设置使得快速检查和过滤大型数据集变得非常容易。
# 4. Modin
Modin 适合那些希望获得更快性能而无需学习新库的人。它使用与 pandas 相同的 API,但以并行方式执行操作。您无需更改现有代码;只需更新导入即可。其他一切都像正常的 pandas 一样工作。使用 pip 安装:
pip install modin[ray]
为了更好地理解,让我们使用与前面相同的泰坦尼克号数据集进行一个小示例,如下所示:
import modin.pandas as pd
url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
# 加载数据集
df = pd.read_csv(url)
# 过滤数据集
adults = df[df["age"] > 18]
# 仅选择几列进行显示
adults_small = adults[["survived", "sex", "age", "class"]]
# 显示结果
adults_small.head()
输出:
survived sex age class 0 0 male 22.0 Third 1 1 female 38.0 First 2 1 female 26.0 Third 3 1 female 35.0 First 4 0 male 35.0 Third
Modin 将工作分散到 CPU 核心上,这意味着您无需进行任何额外操作即可获得更好的性能。
# 5. Dask
如何在不增加 RAM 的情况下处理大数据?当您处理的文件大小超过计算机的随机存取内存(RAM)时,Dask 是一个绝佳的选择。它使用惰性计算,因此它不会将整个数据集加载到内存中。这有助于您流畅地处理数百万行数据。使用以下命令安装:
pip install dask[complete]
为了尝试一下,我们可以使用芝加哥犯罪数据集,如下所示:
import dask.dataframe as dd
import urllib.request
url = "https://data.cityofchicago.org/api/views/ijzp-q8t2/rows.csv?accessType=DOWNLOAD"
local_file = "chicago_crime.csv"
urllib.request.urlretrieve(url, local_file)
# 使用 Dask 读取 CSV(惰性计算)
df = dd.read_csv(local_file, dtype=str) # 所有列都作为字符串
# 过滤分类为 'THEFT' 的犯罪
thefts = df[df['Primary Type'] == 'THEFT']
# 选择几列相关列
thefts_small = thefts[["ID", "Date", "Primary Type", "Description", "District"]]
print(thefts_small.head())
输出:
ID Date Primary Type Description District 5 13204489 09/06/2023 11:00:00 AM THEFT OVER $500 001 50 13179181 08/17/2023 03:15:00 PM THEFT RETAIL THEFT 014 51 13179344 08/17/2023 07:25:00 PM THEFT RETAIL THEFT 014 53 13181885 08/20/2023 06:00:00 AM THEFT $500 AND UNDER 025 56 13184491 08/22/2023 11:44:00 AM THEFT RETAIL THEFT 014
过滤(Primary Type == 'THEFT')和选择列都是惰性操作。过滤会立即发生,因为 Dask 是分块处理数据而不是一次性加载所有数据。
# 结论
我们介绍了五种 pandas 的替代方案以及如何使用它们。本文保持了简洁和专注。有关每个库的完整详细信息,请查阅其官方文档:
如果您遇到任何问题,请发表评论,我将提供帮助。
Kanwal Mehreen 是一位机器学习工程师和技术作家,对数据科学以及人工智能与医学的交叉领域怀有深厚的兴趣。她是电子书《利用 ChatGPT 提高生产力》的合著者。作为 2022 年亚太地区谷歌一代学者,她倡导多样性和学术卓越。她还被认定为 Teradata 技术多样性学者、Mitacs Globalink 研究学者和哈佛 WeCode 学者。Kanwal 是变革的热心倡导者,她创立了 FEMCodes 来赋能 STEM 领域的女性。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区