← 返回文章列表
数据分析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等专为大规模数据设计的库。


相关资源