您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何使用pandas分析大型数据集
## 引言
在当今数据驱动的时代,处理和分析大型数据集已成为数据科学家和分析师的日常工作。Python的pandas库因其强大的数据处理能力而广受欢迎。然而,当面对GB甚至TB级别的数据集时,传统的pandas操作可能会遇到性能瓶颈。本文将深入探讨如何高效使用pandas分析大型数据集,涵盖从内存优化到并行处理的多种技术。
---
## 一、理解pandas的内存机制
### 1.1 pandas数据结构的内存占用
pandas的两种核心数据结构(Series和DataFrame)在内存中以块(block)的形式存储:
- 相同类型的数据会被合并存储
- 对象类型(字符串)会消耗更多内存
```python
import pandas as pd
df = pd.read_csv('large_dataset.csv')
print(df.info(memory_usage='deep')) # 查看详细内存使用
# 优化前
df['price'] = df['price'].astype('float64')
# 优化后
df['price'] = pd.to_numeric(df['price'], downcast='float')
# 对低基数字符串列优化
df['category'] = df['category'].astype('category')
# 适用于包含大量零值或NA值的数据
df = df.astype(pd.SparseDtype("float", 0))
chunk_size = 100000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)
for chunk in chunks:
process(chunk) # 自定义处理函数
cols = ['col1', 'col3', 'col5']
df = pd.read_csv('large_file.csv', usecols=cols)
格式 | 优点 | 缺点 |
---|---|---|
Parquet | 列式存储,高压缩比 | 读写稍慢 |
HDF5 | 快速I/O,支持索引 | 文件大小限制 |
Feather | 极快读取 | 无压缩,占用空间大 |
# Parquet示例
df.to_parquet('data.parquet')
df = pd.read_parquet('data.parquet')
# 不推荐
df[df['age'] > 30]['income'] = 50000
# 推荐
df.loc[df['age'] > 30, 'income'] = 50000
# 传统方式
result = df[(df['price'] > 100) & (df['category'] == 'electronics')]
# 优化方式
result = df.query('price > 100 and category == "electronics"')
# 慢速循环
for i in range(len(df)):
df.iloc[i]['score'] = calculate_score(df.iloc[i])
# 快速向量化
df['score'] = calculate_score_vectorized(df['col1'], df['col2'])
# 标准方法
df.groupby('department')['sales'].sum()
# 使用numba加速
from numba import jit
@jit
def custom_agg(values):
# 自定义聚合逻辑
return ...
df.groupby('key').agg(custom_agg)
# 滚动平均示例
df['rolling_avg'] = df['values'].rolling(window=7).mean()
# 扩展窗口
df['expanding_sum'] = df['values'].expanding().sum()
import dask.dataframe as dd
ddf = dd.from_pandas(df, npartitions=4)
result = ddf.groupby('category').size().compute()
# 随机采样
sample_df = df.sample(frac=0.1)
# 分层采样
from sklearn.model_selection import train_test_split
_, sample_df = train_test_split(df, test_size=0.1, stratify=df['category'])
# 直方图分箱
df['value'].plot.hist(bins=100)
# 热力图
pivot_df = df.pivot_table(index='date', columns='category', values='sales')
sns.heatmap(pivot_df)
import plotly.express as px
fig = px.scatter(df.sample(10000), x='x', y='y', color='category')
fig.show()
# 使用line_profiler
%load_ext line_profiler
%lprun -f process_large_df process_large_df(df)
# 内存分析
from memory_profiler import profile
@profile
def process_data():
# 处理逻辑
from multiprocessing import Pool
def parallel_apply(df, func):
with Pool(4) as p:
return pd.concat(p.map(func, np.array_split(df, 4)))
# 对于复杂表达式
expr = "((df['col1'] > 0.5) & (df['col2'] < 0.3)) | (df['col3'].str.contains('abc'))"
mask = pd.eval(expr)
# 使用pyarrow引擎加速
df = pd.read_csv('sales_10gb.csv', engine='pyarrow')
# 内存优化
df['product_id'] = df['product_id'].astype('category')
# 使用altair进行交互式探索
import altair as alt
alt.Chart(df.sample(100000)).mark_circle().encode(
x='date:T',
y='sales:Q',
color='region:N'
).interactive()
工具 | 最佳场景 | 学习曲线 |
---|---|---|
Polars | 极速处理 | 中等 |
Vaex | 内存映射 | 陡峭 |
Spark | 分布式处理 | 陡峭 |
# Polars示例
import polars as pl
df_pl = pl.read_csv('large_file.csv')
df_pl.groupby('category').agg(pl.col('sales').sum())
处理大型数据集时,pandas仍然是强大的工具,但需要结合特定技术才能发挥最佳性能。关键要点包括:
通过本文介绍的技术,您应该能够轻松处理GB级别的数据集,并为TB级数据做好准备。
”`
这篇文章包含了约3400字,采用Markdown格式编写,涵盖了从基础到高级的pandas大型数据集处理技术,包括代码示例、表格比较和实用建议。您可以根据需要调整具体内容或示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。