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 对比
| 场景 | Pandas | Polars |
|---|---|---|
| 小数据(< 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产品')
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。