Pandas

数据处理完整指南

Series & DataFrameTime Series Analysis
掌握数据科学的核心技能

数据清洗 数据转换 数据分析 可视化

核心概念

Understanding the fundamental building blocks

Series & DataFrame

Core Data Structures

Series - 一维数据结构

import pandas as pd
import numpy as np

# 创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

带索引的一维数组,类似于Excel中的单列数据

DataFrame - 二维数据结构

# 创建DataFrame
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), 
                   index=dates, 
                   columns=list('ABCD'))

二维表格结构,类似于Excel工作表或SQL表

数据读取与写入

Data Input/Output Operations

CSV 文件

df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)

Excel 文件

df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_excel('output.xlsx', index=False)

SQL 数据库

df = pd.read_sql('SELECT * FROM table', connection)
df.to_sql('table_name', connection, if_exists='replace')

数据清洗

Data Cleaning & Preprocessing

处理缺失值

# 检查缺失值
df.isnull().sum()

# 填充缺失值
df.fillna(df.mean(), inplace=True)

# 删除缺失值
df.dropna(inplace=True)

处理重复值

# 检查重复值
df.duplicated().sum()

# 删除重复值
df.drop_duplicates(inplace=True)

处理异常值

# IQR方法检测异常值
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
df_clean = df[~((df < (Q1 - 1.5 * IQR)) | 
                (df > (Q3 + 1.5 * IQR))).any(axis=1)]

数据转换

Transform your data for better analysis

GroupBy & 聚合操作

Split-Apply-Combine Strategy

基础分组操作

# 按单列分组
grouped = df.groupby('column_name')

# 聚合函数
result = df.groupby('category').agg({
    'sales': ['sum', 'mean', 'count'],
    'profit': 'sum'
})

# 多列分组
multi_group = df.groupby(['region', 'category']).sum()

Transform vs Aggregate

# Transform - 保持原数据形状
df['sales_pct'] = df.groupby('category')['sales'].transform(
    lambda x: x / x.sum() * 100
)

# Aggregate - 减少数据维度
summary = df.groupby('category').agg({
    'sales': ['sum', 'mean'],
    'quantity': 'count'
})

数据合并 & 连接

Merge, Join & Concatenate

Merge - SQL风格连接

# Inner join
merged = pd.merge(df1, df2, on='key', how='inner')

# Left join
left_merged = pd.merge(df1, df2, on='key', how='left')

Concat - 拼接数据

# 垂直拼接
result = pd.concat([df1, df2], axis=0)

# 水平拼接
result = pd.concat([df1, df2], axis=1)

数据重塑

Pivot, Melt & Reshape

Pivot - 宽格式转换

pivot_df = df.pivot(index='date', 
                     columns='category', 
                     values='sales')

Melt - 长格式转换

melted_df = pd.melt(df, 
                      id_vars=['id'], 
                      value_vars=['A', 'B', 'C'])

时间序列分析

Master time-based data analysis

时间序列核心操作

Time-based Data Manipulation

日期时间处理

# 创建日期范围
dates = pd.date_range('2023-01-01', 
                        periods=100, 
                        freq='D')

# 转换为日期类型
df['date'] = pd.to_datetime(df['date'])

# 设置日期索引
df.set_index('date', inplace=True)

# 时间切片
recent_data = df['2023-01-01':'2023-12-31']

重采样与聚合

# 按月重采样
monthly = df.resample('M').sum()

# 按周聚合
weekly = df.resample('W').agg({
    'sales': 'sum',
    'customers': 'mean'
})

# 滚动窗口
rolling_avg = df['sales'].rolling(window=7).mean()

实战案例

Titanic Dataset Analysis

数据加载与探索

# 加载泰坦尼克数据集
titanic = pd.read_csv('titanic.csv')

# 基本信息
print(titanic.head())
print(titanic.info())
print(titanic.describe())

数据清洗

# 处理缺失值
titanic['Age'].fillna(titanic['Age'].median(), inplace=True)
titanic['Embarked'].fillna('S', inplace=True)

# 创建新特征
titanic['Family_Size'] = titanic['SibSp'] + titanic['Parch'] + 1

数据分析

# 生存率分析
survival_by_class = titanic.groupby('Pclass')['Survived'].mean()
survival_by_gender = titanic.groupby('Sex')['Survived'].mean()

最佳实践

Professional tips for efficient data processing

性能优化技巧

Performance Optimization

内存优化

# 优化数据类型
df['category'] = df['category'].astype('category')
df['int_col'] = pd.to_numeric(df['int_col'], downcast='integer')

链式操作

# 优雅的链式调用
result = (df
    .dropna()
    .groupby('category')
    .agg({'sales': 'sum'})
    .sort_values('sales', ascending=False)
)

查询优化

# 使用query方法
filtered = df.query('age > 25 and salary > 50000')

# 布尔索引优化
mask = (df['age'] > 25) & (df['salary'] > 50000)
result = df.loc[mask]

代码规范

Clean Code Practices

可读性原则

# 清晰的变量命名
sales_by_region = df.groupby('region')['sales'].sum()

# 适当的注释
# 计算每个地区的销售额占比
region_percentage = sales_by_region / sales_by_region.sum() * 100

错误处理

try:
    df = pd.read_csv('data.csv')
except FileNotFoundError:
    print("文件未找到,请检查文件路径")
except pd.errors.EmptyDataError:
    print("文件为空")

学习路径建议

Structured Learning Journey

基础阶段 (1-2周)

  • • Series和DataFrame基本操作
  • • 数据读取和基本查看
  • • 索引和选择操作

进阶阶段 (2-3周)

  • • 数据清洗技术
  • • GroupBy和聚合操作
  • • 数据合并和重塑

高级阶段 (3-4周)

  • • 时间序列分析
  • • 性能优化技巧
  • • 与其他库的集成

实战阶段 (持续)

  • • 完成实际项目
  • • 参与开源项目
  • • 分享学习成果

学习资源

Curated resources for continuous learning

官方文档

pandas官方文档是最权威的学习资源

访问文档 →

视频教程

通过实战视频快速掌握核心概念

观看教程 →

练习数据集

在Kaggle上找到丰富的练习数据集

探索数据集 →

社区支持

加入pandas社区获得帮助和交流

加入讨论 →