Python 数据分析:Pandas 与 Polars 实战

Python 数据分析核心技能:Pandas DataFrame 操作、数据清洗、聚合统计、时间序列分析,以及 Polars 高性能查询引擎的对比与迁移指南。

1. Pandas 核心操作

1.1 DataFrame 基础

import pandas as pd
import numpy as np

# 创建
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'age': [25, 30, 35, 28],
    'city': ['Beijing', 'Shanghai', 'Beijing', 'Shenzhen'],
    'salary': [15000, 20000, 25000, 18000]
})

# 查看
print(df.head(3))      # 前3行
print(df.info())       # 结构信息
print(df.describe())   # 统计摘要

1.2 数据筛选与查询

# 条件筛选
high_earners = df[df['salary'] > 18000]
beijing_employees = df[(df['city'] == 'Beijing') & (df['age'] > 25)]

# query 语法
result = df.query('salary > 18000 and city == "Beijing"')

# loc / iloc
df.loc[0, 'name']        # 按标签: Alice
df.iloc[0, 0]            # 按位置: Alice
df.loc[0:2, ['name', 'salary']]  # 切片 + 列选择

1.3 数据清洗

# 处理缺失值
df['age'].fillna(df['age'].mean(), inplace=True)  # 均值填充
df.dropna(subset=['salary'], inplace=True)         # 删除缺失

# 去重
df.drop_duplicates(subset=['name'], keep='first')

# 类型转换
df['salary'] = df['salary'].astype(float)
df['date'] = pd.to_datetime(df['date'])

# 字符串操作
df['name_upper'] = df['name'].str.upper()
df['email_domain'] = df['email'].str.split('@').str[1]

1.4 分组聚合

# 分组统计
city_stats = df.groupby('city').agg({
    'salary': ['mean', 'max', 'min'],
    'age': 'mean'
}).round(2)

# 透视表
pivot = pd.pivot_table(df, values='salary', index='city', 
                       columns='age_group', aggfunc='mean')

# 多层级分组
df.groupby(['city', 'department'])['salary'].sum()

2. 时间序列分析

# 创建时间序列
dates = pd.date_range('2024-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100).cumsum(), index=dates)

# 重采样
monthly = ts.resample('M').mean()    # 月均值
daily_sum = ts.resample('D').sum()   # 日合计

# 移动平均
ts_ma = ts.rolling(window=7).mean()  # 7日移动平均

# 滞后与差分
ts_lag = ts.shift(1)       # 滞后1期
ts_diff = ts.diff(1)       # 一阶差分

3. Polars:高性能替代方案

Polars 使用 Rust 编写,查询速度比 Pandas 快 10-100 倍,内存占用更低。

import polars as pl

# 读取(比 Pandas 快数倍)
df = pl.read_csv('large_file.csv')
df = pl.read_parquet('data.parquet')  # 列式存储最佳

# 惰性求值(Lazy Evaluation)
df_lazy = (pl.scan_csv('large_file.csv')   # 不立即加载
    .filter(pl.col('salary') > 10000)
    .group_by('city')
    .agg(pl.col('salary').mean().alias('avg_salary'))
    .sort('avg_salary', descending=True))

result = df_lazy.collect()  # 执行并获取结果

# 与 Pandas 互转
df_pandas = df.to_pandas()
df_polars = pl.from_pandas(df_pandas)

3.1 Pandas vs Polars 对比

场景PandasPolars
小数据(< 1GB)✅ 简单直观✅ 也很快
大数据(> 10GB)❌ 内存爆炸✅ 惰性求值
复杂查询✅ 成熟生态✅ 语法更简洁
数据流处理✅ Streaming
学习成本

4. 实战:销售数据分析

import pandas as pd

# 加载数据
sales = pd.read_csv('sales_2024.csv', parse_dates=['date'])

# 数据清洗
sales = sales.dropna(subset=['amount'])
sales['amount'] = sales['amount'].abs()  # 修正负数

# 新增维度
sales['month'] = sales['date'].dt.month
sales['quarter'] = sales['date'].dt.quarter
sales['category'] = sales['product'].map(product_category_map)

# 核心指标
monthly_revenue = sales.groupby('month')['amount'].sum()
top_products = sales.groupby('product')['amount'].sum().nlargest(10)
category_share = sales.groupby('category')['amount'].sum() / sales['amount'].sum()

# 导出报表
with pd.ExcelWriter('sales_report.xlsx') as writer:
    monthly_revenue.to_frame().to_excel(writer, sheet_name='月度营收')
    top_products.to_frame().to_excel(writer, sheet_name='Top10产品')

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「python」更多文章

  1. Python 高级异步编程:Trio 结构化并发与 AnyIO 兼容层
  2. Python 数据工程与 ETL 管道实战
  3. Python 元编程与动态特性深度解析