Python Pandas库超详细教程:从入门到精通实战指南

以下是一份Python Pandas 库从入门到精通的超详细实战指南(基于2026年1月现状,pandas 最新稳定版已到 3.0.x 系列,2.3.x 为过渡版本,3.0 带来默认 string dtype 等重大变化)。

我会按实际使用路径组织内容:先快速上手 → 核心数据结构 → 数据清洗 → 聚合分析 → 高级技巧 → 性能优化 → 真实项目模式。

0. 环境准备(2026年推荐)

# 推荐使用最新版(支持 Python 3.11~3.14)
pip install --upgrade pandas pyarrow numpy

# 可选但强烈推荐(加速 + parquet + string dtype 更好支持)
pip install pyarrow fastparquet
import pandas as pd
import numpy as np

print(pd.__version__)          # 建议 ≥ 3.0.0
print(pd.get_option("mode.string_storage"))  # 通常是 'pyarrow_numpy' 或 'python'

pandas 3.0+ 重要变化(必须知道):

  • 默认字符串类型 → string[pyarrow_numpy]string[python](不再是 object
  • 很多旧的 deprecated API 被彻底移除
  • 性能大幅提升(尤其 groupby、join、字符串操作)

1. 核心数据结构速览(5分钟掌握本质)

结构对应 Excel一句话本质主要场景内存标签(pandas 3.0+)
Series一列带标签的 1维数组单列数据、时间序列dtype 可为 Arrow
DataFrame表格带行/列索引的 2维表几乎所有 tabular 数据
Index行/列标签不可变数组(可多级)索引、对齐、合并依据

2. 读取数据(最常用的 10 种方式)

# 经典
df = pd.read_csv("data.csv", encoding="utf-8-sig", dtype_backend="pyarrow")   # 3.0+ 推荐

df = pd.read_excel("sales.xlsx", sheet_name="2025Q4", engine="openpyxl")

df = pd.read_parquet("bigfile.parquet")               # 最推荐大文件格式

df = pd.read_json("api_response.json", lines=True)    # 常见日志/爬虫

df = pd.read_sql("SELECT * FROM orders WHERE year=2025", con=engine)

# 快速预览神器
df = pd.read_csv("huge.csv", nrows=10000)             # 先看前1万行
df = pd.read_csv("huge.csv", chunksize=500_000)       # 分块读取(后面会讲)

pandas 3.0+ 推荐始终加上:dtype_backend="pyarrow"(内存少、速度快)

3. 探索数据(EDA 标准 8 步)

df.shape               # (行数, 列数)
df.info(memory_usage="deep")   # 类型 + 非空 + 内存
df.describe(percentiles=[.01,.05,.25,.5,.75,.95,.99])  # 极端值敏感
df.nunique()           # 每列唯一值个数
df.isna().sum() / len(df) * 100   # 缺失率(%)

# 高频值 Top3
for col in df.select_dtypes("string").columns:
    print(f"\n{col} 前三高频:")
    print(df[col].value_counts(dropna=False).head(3))

df.sample(8)           # 随机8行(比 head 更真实)

4. 数据清洗 – 最高频操作一网打尽

# 缺失值处理(2025-2026 主流组合)
df = df.assign(
    age = df["age"].fillna(df["age"].median()),
    income = df["income"].fillna(method="ffill"),   # 向前填充(时间序列常用)
    gender = df["gender"].fillna("Unknown")
).dropna(subset=["user_id", "order_date"])          # 关键字段不允许空

# 去重(保留最后一条最常见)
df = df.drop_duplicates(subset=["user_id", "event"], keep="last")

# 类型转换(3.0+ 更安全)
df = df.astype({
    "order_date": "datetime64[ns]",
    "price": "float64[pyarrow]",
    "user_id": "string[pyarrow]",
    "category": "category"               # 低基数分类变量省内存
})

# 字符串清洗
df["product_name"] = (
    df["product_name"]
    .str.strip()
    .str.lower()
    .str.replace(r"\s+", " ", regex=True)
    .replace({"iphone 1[456] pro max": "iphone pro max"}, regex=True)
)

# 异常值处理(常见 winsorize)
clip_lower, clip_upper = df["amount"].quantile([0.005, 0.995])
df["amount_clip"] = df["amount"].clip(clip_lower, clip_upper)

5. 核心操作 – groupby + agg + transform + pivot 组合拳

# 单表聚合(最常用写法 2025+)
sales_by_month = (
    df.query("year == 2025")
     .assign(month=lambda x: x["order_date"].dt.to_period("M"))
     .groupby(["category", "month"], observed=True, dropna=False)
     .agg(
         revenue=("amount", "sum"),
         orders=("order_id", "nunique"),
         avg_price=("amount", "mean"),
         active_users=("user_id", "nunique")
     )
     .round(2)
     .reset_index()
)

# transform 经典场景:每组排名、组内占比
df["rank_in_category"] = df.groupby("category")["amount"].rank(ascending=False)
df["pct_of_category"] = df.groupby("category")["amount"].transform(lambda x: x / x.sum())

# 多表合并(left join 最常见)
df = df.merge(
    user_df[["user_id", "reg_date", "city"]],
    on="user_id",
    how="left",
    suffixes=("", "_user")
)

# pivot_table(报表神器)
pd.pivot_table(
    df,
    values="amount",
    index="month",
    columns="category",
    aggfunc=["sum", "count"],
    margins=True,
    margins_name="总计"
)

6. 时间序列处理(电商/金融必备)

df["order_date"] = pd.to_datetime(df["order_date"])

# 提取各种时间维度
df["year"]   = df["order_date"].dt.year
df["quarter"] = df["order_date"].dt.quarter
df["month"]  = df["order_date"].dt.month
df["week"]   = df["order_date"].dt.isocalendar().week
df["dayofweek"] = df["order_date"].dt.dayofweek          # 0=周一
df["is_weekend"] = df["order_date"].dt.dayofweek >= 5

# 重采样(日 → 月)
monthly = df.set_index("order_date").resample("ME")["amount"].sum()   # ME = month end

7. 性能优化 – 大数据时代必知(2025-2026 重点)

场景推荐做法加速倍数参考
>1GB csvread_parquet + dtype_backend=”pyarrow”3-10×
groupby 很慢.agg() 用元组写法 / pyarrow string2-5×
循环/iterrows改用 vectorized / apply / map10-1000×
内存爆炸category 类型 + downcast + gc.collect30-70% ↓
超大表 joinmerge + sort=False 或 pd.concat
重复 groupby先 groupby 对象保存,再多次 agg2-4×
# 内存优化示例
df["category"] = df["category"].astype("category")
df["user_id"] = df["user_id"].astype("string[pyarrow]")
df["price"] = pd.to_numeric(df["price"], downcast="float")

8. 真实项目模板(推荐结构)

# project/pipeline.py
import pandas as pd
from pathlib import Path

def load_raw():
    return pd.read_parquet("data/raw/orders_2025.parquet")

def clean(df):
    # 所有清洗逻辑...
    return df

def feature_engineering(df):
    # 时间特征、占比、排名...
    return df

def aggregate(df):
    # 核心宽表 / 报表
    return ...

if __name__ == "__main__":
    df = load_raw()
    df_clean = clean(df)
    df_feat = feature_engineering(df_clean)
    result = aggregate(df_feat)
    result.to_parquet("data/processed/monthly_report.parquet")
    print("Done.")

进阶学习路线建议(2026版)

阶段重点掌握推荐资源(截至2026年1月)
入门read_xxx, select_dtypes, groupby+agg官方10分钟入门 + Corey Schafer 视频
中级merge/join, pivot_table, 时间序列, apply/mapReal Python pandas 路径
高级pyarrow backend, MultiIndex, 自定义 agg, stylepandas 3.0 what’s new + 用户指南
专家query/numexpr, styler, pandas + polars 对比, daskTowards Data Science 2025高级文章 + GitHub 源码

有想重点深入的模块吗?
例如:

  • pandas + polars / duckdb 对比与迁移
  • 超大文件(几十GB)处理实战
  • pandas styler 做报表美化
  • groupby 高级玩法(rolling, expanding, grouper)

告诉我,我可以继续展开对应部分~

文章已创建 3958

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部