数据分析2024年12月05日· 8分钟
Python数据分析实战:Pandas高级技巧
掌握Pandas的高级功能,包括数据清洗、转换、聚合和性能优化技巧,提升数据分析效率。
作者:AI & Finance
#Python#Pandas#数据科学#数据清洗
为什么选择Pandas?
Pandas是Python数据分析的核心库,提供了高效、灵活的数据结构和数据分析工具。
数据导入与检查
import pandas as pd
import numpy as np
# 读取CSV文件
df = pd.read_csv('financial_data.csv', parse_dates=['date'])
# 快速查看数据概况
print(df.info())
print(df.describe())
print(df.head())
# 检查缺失值
print(df.isnull().sum())
数据清洗技巧
处理缺失值
# 删除含有缺失值的行
df_clean = df.dropna()
# 填充缺失值
df['price'].fillna(df['price'].mean(), inplace=True)
df['category'].fillna('未知', inplace=True)
# 前向填充
df['price'].fillna(method='ffill', inplace=True)
处理重复值
# 检查重复
duplicates = df.duplicated()
print(f"重复行数: {duplicates.sum()}")
# 删除重复
df_unique = df.drop_duplicates(subset=['id'], keep='first')
数据转换与特征工程
时间序列处理
# 设置日期索引
df.set_index('date', inplace=True)
# 重采样 - 将日数据转换为月数据
monthly_data = df.resample('M').agg({
'price': 'mean',
'volume': 'sum',
'high': 'max',
'low': 'min'
})
# 计算移动平均
df['ma_7'] = df['price'].rolling(window=7).mean()
df['ma_30'] = df['price'].rolling(window=30).mean()
# 计算收益率
df['returns'] = df['price'].pct_change()
分组聚合
# 按类别分组统计
grouped = df.groupby('category').agg({
'price': ['mean', 'std', 'min', 'max'],
'volume': 'sum',
'id': 'count'
})
# 多层分组
multi_group = df.groupby(['year', 'category'])['revenue'].sum()
# 自定义聚合函数
def coefficient_of_variation(x):
return x.std() / x.mean()
cv = df.groupby('category')['price'].apply(coefficient_of_variation)
高级操作
Apply和Lambda函数
# 应用自定义函数
df['price_category'] = df['price'].apply(
lambda x: 'High' if x > 100 else 'Low'
)
# 对整行操作
df['total'] = df.apply(
lambda row: row['price'] * row['quantity'],
axis=1
)
透视表和交叉表
# 创建透视表
pivot = pd.pivot_table(
df,
values='revenue',
index='product',
columns='region',
aggfunc='sum',
fill_value=0
)
# 交叉表
crosstab = pd.crosstab(
df['category'],
df['status'],
margins=True
)
性能优化技巧
使用向量化操作
# ❌ 慢 - 使用循环
result = []
for i in range(len(df)):
result.append(df.loc[i, 'a'] + df.loc[i, 'b'])
# ✅ 快 - 使用向量化
result = df['a'] + df['b']
优化数据类型
# 减少内存使用
df['category'] = df['category'].astype('category')
df['int_column'] = df['int_column'].astype('int32')
# 检查内存使用
print(df.memory_usage(deep=True))
使用Chunk读取大文件
# 分块读取大型CSV
chunk_size = 10000
chunks = []
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
# 处理每个chunk
processed = chunk[chunk['value'] > 0]
chunks.append(processed)
df = pd.concat(chunks, ignore_index=True)
实战案例:股票数据分析
import matplotlib.pyplot as plt
# 计算技术指标
def calculate_rsi(prices, period=14):
"""计算相对强弱指标"""
delta = prices.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
return rsi
# 应用到数据
stock_df['RSI'] = calculate_rsi(stock_df['close'])
# 识别交易信号
stock_df['signal'] = np.where(
(stock_df['RSI'] < 30) & (stock_df['RSI'].shift(1) >= 30),
'BUY',
np.where(
(stock_df['RSI'] > 70) & (stock_df['RSI'].shift(1) <= 70),
'SELL',
'HOLD'
)
)
常用函数速查表
| 函数 | 功能 | 示例 |
|---|---|---|
head() | 查看前几行 | df.head(10) |
groupby() | 分组聚合 | df.groupby('col').sum() |
merge() | 合并数据 | pd.merge(df1, df2, on='id') |
pivot_table() | 透视表 | pd.pivot_table(df, ...) |
rolling() | 滚动窗口 | df['col'].rolling(7).mean() |
总结
掌握Pandas的关键:
- ✅ 理解DataFrame和Series结构
- ✅ 熟练使用向量化操作
- ✅ 灵活运用分组聚合
- ✅ 注意性能优化
Pro Tip: 在处理大数据时,优先考虑使用Dask或Polars等专为大规模数据设计的库。
相关资源:
- Pandas官方文档
- Python for Data Analysis - Wes McKinney