0. 环境准备(当前推荐)
# 推荐使用最新版(支持 Python 3.11~3.14)
pip install --upgrade pandas pyarrow numpy
# 可选但强烈推荐(加速 + parquet + string dtype 更好支持)
pip install pyarrow fastparquet
import pandas pd
numpy np
(pd.__version__)
(pd.get_option())
Python Pandas 库核心用法实战指南。涵盖环境配置、数据结构、数据读取、清洗、聚合分析、时间序列处理及性能优化。包含 pandas 3.0+ 新特性如 string dtype,提供从 EDA 到项目模板的完整路径,助力开发者高效处理表格数据。
# 推荐使用最新版(支持 Python 3.11~3.14)
pip install --upgrade pandas pyarrow numpy
# 可选但强烈推荐(加速 + parquet + string dtype 更好支持)
pip install pyarrow fastparquet
import pandas pd
numpy np
(pd.__version__)
(pd.get_option())
pandas 3.0+ 重要变化(必须知道):
string[pyarrow_numpy] 或 string[python](不再是 object)| 结构 | 对应 Excel | 一句话本质 | 主要场景 | 内存标签(pandas 3.0+) |
|---|---|---|---|---|
| Series | 一列 | 带标签的 1 维数组 | 单列数据、时间序列 | dtype 可为 Arrow |
| DataFrame | 表格 | 带行/列索引的 2 维表 | 几乎所有 tabular 数据 | — |
| Index | 行/列标签 | 不可变数组(可多级) | 索引、对齐、合并依据 | — |
# 经典
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"(内存少、速度快)
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 更真实)
# 缺失值处理(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)
# 单表聚合(最常用写法 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="总计"
)
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
| 场景 | 推荐做法 | 加速倍数参考 |
|---|---|---|
| >1GB csv | read_parquet + dtype_backend="pyarrow" | 3-10× |
| groupby 很慢 | .agg() 用元组写法 / pyarrow string | 2-5× |
| 循环/iterrows | 改用 vectorized / apply / map | 10-1000× |
| 内存爆炸 | category 类型 + downcast + gc.collect | 30-70% ↓ |
| 超大表 join | merge + sort=False 或 pd.concat | — |
| 重复 groupby | 先 groupby 对象保存,再多次 agg | 2-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")
# 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.")
| 阶段 | 重点掌握 | 推荐资源(截至当前) |
|---|---|---|
| 入门 | read_xxx, select_dtypes, groupby+agg | 官方 10 分钟入门 + Corey Schafer 视频 |
| 中级 | merge/join, pivot_table, 时间序列,apply/map | Real Python pandas 路径 |
| 高级 | pyarrow backend, MultiIndex, 自定义 agg, style | pandas 3.0 what's new + 用户指南 |
| 专家 | query/numexpr, styler, pandas + polars 对比,dask | Towards Data Science 2025 高级文章 + GitHub 源码 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online