第3章 数据分析
3.1 项目背景
数据集记录了完整的用户、订单、商品、浏览行为、评分等电商交易数据,具有时间跨度长、用户规模大、行为类型丰富等特点。这些特点决定了数据中隐藏着大量消费趋势和用户偏好模式。
例如,相对于“查询用户U10001在2022年5月1日下的订单详情”这样的细节查询,更具洞察力的查询还包括:
“2023年广东省用户最偏爱的商品品类有哪些?”
“过去5年广州地区用户的下单量是否呈增长趋势?”
“90后女性用户更偏好哪类商品?”
“近三个月热销商品是否集中在某几个品牌?”
“高评分商品是否价格更高?”
上述查询可帮助企业从复杂的大数据中提炼出有价值的信息,辅助产品推荐、营销策略与用户运营。
3.2 技能图谱
Pandas 数据分析
│
├── 1. 列处理
│ ├── 重命名列
│ │ └── df.rename(columns={"旧列名":"新列名"}, inplace=False)
│ ├── 删除列
│ │ └── df.drop(columns=["列名"], inplace=False)
│ └── 合并列
│ ├── 字符串拼接 → df["新列"] = df["A"] + "_" + df["B"]
│ └── 数值运算 → df["新列"] = df["数量"] * df["单价"]
│
├── 2. 日期处理
│ ├── 转换日期格式
│ │ └── pd.to_datetime(df["日期列"])
│ ├── 提取时间组件
│ │ ├── .dt.year / .dt.month / .dt.day
│ │ └── .dt.strftime("%Y-%m")
│ └── 时间运算
│ └── df["间隔"] = df["结束"] - df["开始"]
│
├── 3. 排序与统计
│ ├── 排序 sort_values()
│ │ ├── 单列排序 → df.sort_values(by="列")
│ │ └── 多列排序 → df.sort_values(by=["列1","列2"], ascending=[True,False])
│ ├── 单列统计
│ │ ├── mean() / sum() / max() / min()
│ │ ├── count() / nunique() / value_counts()
│ │ └── describe() 综合统计
│ └── 分组统计 groupby()
│ ├── 单列分组 + 单指标 → df.groupby("A")["B"].sum()
│ ├── 多列分组 → df.groupby(["A","B"])["C"].mean()
│ └── groupby + agg() 多指标
│ ├── df.groupby("A").agg({"B":"sum","C":"mean"})
│ └── 扁平化列名 → result.columns=[...]
│
├── 4. 表连接 merge()
│ ├── 基本语法 → pd.merge(df1, df2, on="key", how="inner")
│ ├── 连接方式
│ │ ├── inner → 保留匹配
│ │ ├── left → 保留左表
│ │ ├── right → 保留右表
│ │ └── outer → 全部保留
│ ├── 不同列名连接 → left_on / right_on
│ └── 多字段连接 → on=["字段1","字段2"]
│
└── 5. 数据透视表 pivot_table()
├── 基本语法 → pd.pivot_table(df, index="行", values="值", aggfunc="sum")
├── 单维分析
│ └── 按分类统计销量
├── 区域分析
│ └── 按省份/城市统计订单量
├── 二维交叉
│ └── index="brand", columns="payment_method"
└── 加权统计
└── df["金额"]=数量*单价*折扣,再聚合 sum()3.3 列处理
3.3.1 重命名列标签
【知识点】
在 Pandas 中,使用 .rename() 方法可对 DataFrame 的列标签(列名)进行重命名。
【基本语法】
df.rename(columns={"旧列名": "新列名"}, inplace=False)
columns={}:以字典形式传入要修改的列名;inplace=False:是默认写法,可以省略,意思是不修改原数据,保存需要重新赋值inplace=True:直接修改原数据;通常用于统一命名规范或清洗含空格/拼写不规范的列名。
【例 3-1】将用户表 users.csv 中的列名 user_name 改为 name,register_date 改为 signup_date
import pandas as pd
users = pd.read_csv("users.csv")
users = users.rename(columns={"user_name": "name", "register_date": "signup_date"})
users.head()语法重点:
使用
.rename(columns={...})修改列名;若不加
inplace=True,修改不会作用于原表,需使用新变量接收。
3.3.2 删除、合并列
【知识点1】删除列(drop() 方法)
使用 drop() 可删除指定列,常用于数据清洗或字段精简。
【语法结构】:
df.drop(columns=["列名1", "列名2"], inplace=False)
columns=[...]:要删除的列名列表;inplace=True:是否原地修改,默认为 False;支持删除一列或多列。
【知识点2】合并列(通过运算或拼接)
当需要将多个字段合成为一个字段时,可用字符串拼接或数值运算。
【语法结构】:
df["新列名"] = df["列A"] + "_" + df["列B"]
字符串字段可拼接(如城市+省份);
数值列可加总(如数量 × 单价 = 金额);
可使用
astype(str)统一类型以避免错误。
【例 3-2】从 users.csv 中删除 province 列,并将 city 与 user_name 合并为新列 location
import pandas as pd
users = pd.read_csv("users.csv")
users.head()
# 删除列
users = users.drop(columns=["province"])
# 合并列为新列
users["location"] = users["city"] + "_" + users["user_name"]
users.head()语法重点:
.drop(columns=["col"])删除字段;列拼接时使用
+,字段类型为字符串;若拼接列为数字类型,需先
.astype(str)。
3.3.3 转换日期数据
【知识点】
Pandas 中可以通过 pd.to_datetime() 将字符串类型的日期字段转换为标准的 datetime64[ns] 类型,便于进行时间筛选、提取年/月/日、计算时间差等操作。
基本语法
data["日期列"] = pd.to_datetime(data["原始列"])
支持日期格式自动识别,也可添加
format参数指定格式;转换后可使用
.dt.year、.dt.month等属性进行拆解;日期字段在电商数据中常用于注册时间、下单时间、浏览时间、评分时间等。
【例 3-3】将用户表 users.csv 中的注册时间 register_date 字段转换为日期格式,并提取注册年份
import pandas as pd
users = pd.read_csv("users.csv")
# 转换日期字段
users["register_date"] = pd.to_datetime(users["register_date"])
# 提取年份
users["register_year"] = users["register_date"].dt.year
users[["user_id", "register_date", "register_year"]].head()语法重点:
pd.to_datetime()可将字符串类型转换为标准日期时间类型;.dt.year,.dt.month,.dt.day,.dt.date可提取时间组件;转换为日期格式是做趋势分析、分组统计(如“每年订单量”)的前提。
教学小结:
| 操作类型 | 方法示例 |
|---|---|
| 转换为日期格式 | pd.to_datetime(data["列名"]) |
| 提取年份 | data["列"].dt.year |
| 提取年月 | data["列"].dt.strftime("%Y-%m") |
| 筛选某一年数据 | data[data["列"].dt.year == 2023] |
| 时间差计算 | data["间隔"] = data["结束"] - data["开始"] |
【例 3-4】将订单表 orders.csv 中的下单时间 order_time 转换为日期格式,提取订单年份,并筛选出 2023年数据
import pandas as pd
orders = pd.read_csv("orders.csv")
# 1. 转换 order_time 为日期格式
orders["order_time"] = pd.to_datetime(orders["order_date"])
# 2. 提取年份字段,生成新列
orders["order_year"] = orders["order_time"].dt.year
# 3. 筛选 2023 年订单
orders.query('order_year==2023')【练习题】
【练习 3-1】将商品表 products.csv 中的列名 unit_price 改为 price,并输出商品名称和价格。
import pandas as pd
products = pd.read_csv("products.csv")
# 重命名列
products = products.rename(columns={"unit_price": "price"})
# 查看商品名称与价格
print(products[["product_name", "price"]].head())【练习 3-2】在用户表 users.csv 中删除 city 列,只查看 user_id、user_name、province列的 5 行。
users = pd.read_csv("users.csv")
# 删除 city 列
users = users.drop(columns=["city"])
# 查看部分结果
print(users[["user_id", "user_name", "province"]].head())【练习 3-3】将评分表 product_ratings.csv 中的 rating_time 转换为日期格式,并提取出 评分月份,存入新列 month。
import pandas as pd
ratings = pd.read_csv("product_ratings.csv")
# 转换为日期格式
ratings["rating_time"] = pd.to_datetime(ratings["rating_time"])
# 提取月份(1-12)
ratings["month"] = ratings["rating_time"].dt.month
print(ratings[["user_id", "product_id", "month"]].head())3.4 统计分析
3.4.1 实现数据排序
【知识点】
Pandas 中使用 .sort_values() 方法对 DataFrame 进行排序,可实现单列、多列排序,支持升序与降序控制。
基本语法:
df.sort_values(by="列名", ascending=True)
| 参数 | 含义说明 |
|---|---|
by | 指定排序的列名,可是字符串或列表 |
ascending | 是否升序,默认 True,设为 False 表示降序 |
inplace=True | 是否原地修改,默认为False表示不修改原数据 |
【例 3-5】对商品信息表 products.csv 按 unit_price 降序排序,查看前5个最贵商品的名称与价格
import pandas as pd
products = pd.read_csv("products.csv")
top_price = products.sort_values(by="unit_price", ascending=False)
top_price[["product_name", "unit_price"]].head()语法重点:
by="unit_price"表示以价格字段排序;ascending=False表示降序排序;可用
.head()提取前几项;多列排序示例:
by=["category", "unit_price"](先按类别,再按价格)。
【例 3-6】对顾客信息表 users.csv 按年龄 age 升序排序,查看年龄最小的前5位顾客姓名与年龄
users = pd.read_csv("users.csv")
youngest = users.sort_values(by="age", ascending=True)
youngest[["user_name", "age"]].head()语法点强化:
by="age":按年龄字段排序;ascending=True:升序,越小越靠前;head():提取前5行,查看最年轻的顾客;同样也可以在
sort_values()中加入inplace=True直接修改原表。
【例 3-7】按地区 province 和年龄 age 升序排序,查看每个地区最年轻的顾客
users = pd.read_csv("users.csv")
sorted_users = users.sort_values(by=["province", "age"], ascending=[True, True])
sorted_users[["province", "user_name", "age"]].head(10)语法说明:
by=["province", "age"]:先按地区,再按年龄;ascending=[True, True]:两个字段都升序;用
head(10)查看前10行结果;常用于分组下的优先级排序。
3.4.2 实现简单统计
【知识点】
Pandas 提供了丰富的统计方法用于对 DataFrame 或 Series 数据进行快速汇总,常用于描述性统计分析与业务概况分析。
常用统计方法(共 13 个)
| 方法 | 含义说明 | 示例用途 |
|---|---|---|
mean() | 平均值 | 用户平均年龄、平均订单金额 |
max() | 最大值 | 最贵商品价格、最高评分 |
min() | 最小值 | 最低评分、最小下单金额 |
sum() | 求和 | 总销售额、商品销量总数 |
count() | 统计非空值(排除缺失值 NaN) | 某列的有效记录数 |
size | 总行数(适用于分组,包括缺失值 NaN) | 每个品类商品数、每个用户下单数 |
std() | 标准差 | 用户年龄波动情况、评分稳定性 |
var() | 方差 | 销售金额方差 |
median() | 中位数 | 商品价格中位数 |
mode() | 众数(最频繁出现的值) | 最常用支付方式 |
describe() | 综合统计汇总(数值列) | 平均数、最值、标准差、四分位数等 |
value_counts() | 各取值频次统计(Series) | 品牌分布、性别分布、订单状态分布 |
nunique() | 去重后的唯一值个数 | 用户来源城市数、商品种类数 |
【例 3-8】对订单明细表 order_items.csv 进行统计,计算商品总销量、平均购买数量、最大折扣
import pandas as pd
items = pd.read_csv("order_items.csv")
total_quantity = items["quantity"].sum()
avg_quantity = items["quantity"].mean()
max_discount = items["discount"].max()
print("总销量:", total_quantity)
print("平均购买数量:", avg_quantity)
print("最大折扣:", max_discount)语法重点:
适用于单列计算;
可以配合
.groupby()在后续实现按类统计;可直接用于绘图、报告展示的前期数据准备。
3.4.3 实现分组统计
【知识点】
Pandas 提供 .groupby() 方法,可以按某一列或多列进行分组,对每组应用统计函数(如 sum、mean、count 等),实现分组聚合。
基本语法结构
df.groupby("列名")["指标列"].统计方法()
或:
data.groupby("列名").agg({"指标列1": "sum", "指标列2": "mean"})
支持单列或多列分组;
支持多个统计指标聚合;
可使用
.reset_index()使结果转为DataFrame常规表格形式。
【例 3-9】对商品表 products.csv 按 category 进行分组,统计每个类别下的商品数量
# 方法一
import pandas as pd
products = pd.read_csv("products.csv")
# 对 products 表按 "category" 字段进行分组
# 然后使用 .size() 统计每个分组中的数据条数(即每类商品的数量)
# 最终返回一个 Series,索引为各类目,值为该类目的商品数量
# .reset_index(name="商品数量"):将结果转换为 DataFrame,并设置新列名为“商品数量”
category_counts = products.groupby("category").size().reset_index(name="商品数量")
category_counts
# 方法二
import pandas as pd
products = pd.read_csv("products.csv")
# .reset_index(name="商品数量"):将结果转换为 DataFrame,并设置新列名为“商品数量”
category_counts = products.groupby("category").size().reset_index(name="商品数量")
category_counts【例 3-10】对订单明细表 order_items.csv 按 product_id 分组,统计每件商品的总销售数量
import pandas as pd
items = pd.read_csv("order_items.csv")
product_sales = items.groupby("product_id")["quantity"].sum().reset_index(name="总销量")
product_sales.head()【例 3-11】对用户表 users.csv 按性别分组,计算每组用户的平均年龄
users = pd.read_csv("users.csv")
avg_age = users.groupby("gender")["age"].mean().reset_index(name="平均年龄")
avg_age【例 3-12】对用户表 users.csv 按“省份 + 性别”分组,计算每组的平均年龄
import pandas as pd
users = pd.read_csv("users.csv")
# 按省份(province)和性别(gender)两个字段分组,统计每组的平均年龄
# groupby(["province", "gender"]):多字段分组
# ["age"].mean():取年龄列计算平均值
# reset_index():将分组结果转为普通表格,并命名新列为“平均年龄”
avg_age = users.groupby(["province", "gender"])["age"].mean().reset_index(name="平均年龄")
avg_age语法重点总结:
| 操作目标 | 示例语法 |
|---|---|
| 单列分组 + 单指标统计 | df.groupby("分类列")["数值列"].sum() |
| 分组后多指标统计 | .agg({"列A": "sum", "列B": "mean"}) |
| 分组结果转表格 | .reset_index() |
| 分组记录数统计 | .size() 或 ["字段"].count() |
3.4.4 综合聚合:使用 groupby + agg() 多字段多指标统计
【知识点】
.agg() 是 .groupby() 的增强版聚合操作,用于对每个分组执行一个或多个统计操作。
语法结构
data.groupby("分组字段").agg({
"字段1": "聚合函数1",
"字段2": ["聚合函数2", "聚合函数3"]
...
}).reset_index()
# .reset_index() 将结果索引变为普通列,方便后续操作【例 3-12】在订单明细表中,统计每个商品的总销量与平均折扣
import pandas as pd
items = pd.read_csv("order_items.csv")
# 按商品分组,统计总销量与平均折扣
summary = items.groupby("product_id").agg({
"quantity": "sum", # 每个商品的总购买数量
"discount": "mean" # 每个商品的平均折扣
}).reset_index()
# 重命名列名,便于查看
summary.columns = ["product_id", "总销量", "平均折扣"]
# 显示前几行结果
summary.head()【例 3-13】对用户表 users.csv,统计各省份用户的平均年龄与注册人数
import pandas as pd
users = pd.read_csv("users.csv")
# 按省份分组,统计平均年龄与注册人数
result = users.groupby("province").agg({
"age": "mean", # 统计平均年龄
"user_id": "count" # 统计注册用户数量
}).reset_index()
# 修改列名,便于展示
result.columns = ["省份", "平均年龄", "注册人数"]
result.head()语法要点
| 技能点 | 示例 |
|---|---|
| 多列多方法聚合 | .agg({"col1": "sum", "col2": "mean"}) |
| 多方法一个字段 | .agg({"col": ["min", "max", "mean"]}) |
| 扁平化修改列名 | .columns = ['A', 'B', 'C'] |
| 与排序结合 | .sort_values(by="总销量", ascending=False) |
【例 3-14】用户浏览次数统计
读取用户行为日志表 logs.csv,统计每位用户的浏览次数(即行为记录数),并按次数从高到低排序,输出前 5 位用户。
import pandas as pd
# 读取用户行为日志表
logs = pd.read_csv("browsing_logs.csv")
# 按用户编号分组,统计其行为记录数(浏览、加购、收藏等)
user_views = logs.groupby("user_id").agg({
"action_type": "count"
}).reset_index()
# 重命名列名为“浏览次数”
user_views.columns = ["user_id", "浏览次数"]
# 按浏览次数降序排列,查看最活跃的前5位用户
user_views = user_views.sort_values(by="浏览次数", ascending=False)
# 输出结果
user_views.head()
语法要点
groupby("user_id")分组;agg({"action_type": "count"})对某字段进行计数;reset_index()重置索引为普通列;sort_values()排序后查看高频用户。
【例 3-15】用户评分行为统计
读取评分表 product_ratings.csv,统计每位用户的评分次数和平均评分,按评分次数从高到低排序。
ratings = pd.read_csv("product_ratings.csv")
# 分组统计评分次数与平均分
user_ratings = ratings.groupby("user_id").agg({
"rating": ["count", "mean"]
}).reset_index()
# 扁平化列名
user_ratings.columns = ["user_id", "评分次数", "平均评分"]
user_ratings = user_ratings.sort_values(by="评分次数", ascending=False)
user_ratings.head()语法要点
agg()同时统计多个字段;["count", "mean"]多函数聚合;.columns = [...]重命名列标题,避免多层索引。
【例 3-16】品牌商品统计
读取商品信息表 products.csv,统计每个品牌的商品数、平均价格和最高价格,按平均价格从高到低排序。
import pandas as pd
# 读取商品信息表
products = pd.read_csv("products.csv")
print(products.head())
# 按品牌分组,统计商品数、平均价格和最高价格
brand_stats = products.groupby("brand").agg({
"product_id": "count", # 每个品牌的商品数量
"unit_price": ["mean", "max"] # 每个品牌的平均单价和最高单价
}).reset_index()
# 扁平化列名
brand_stats.columns = ["brand", "商品数", "平均价格", "最高价格"]
# 按平均价格降序排序,查看单价最高的品牌
brand_stats = brand_stats.sort_values(by="平均价格", ascending=False)
# 输出前5行
brand_stats.head()
3.5 表连接
基本语法:
pd.merge(
表1,
表2,
on="公共列名",
how="连接方式"
)参数说明:
| 参数 | 含义 |
|---|---|
表1 / 表2 | 要连接的两个 DataFrame 表 |
on | 指定连接依据的列名(两个表中都必须有) |
how | 连接方式参数inner / left(下表详解) |
四种连接方式(how 参数):
| 连接方式 | 说明 |
|---|---|
"inner" | 内连接,仅保留两表中都存在的匹配行(常用) |
"left" | 左连接,保留左表全部,右表匹配上则填写,否则为 NaN |
"right" | 右连接,保留右表全部,左表匹配上则填,否则为 NaN |
"outer" | 外连接,保留两表全部,缺失部分用 NaN 补齐 |
进阶语法:
使用不同列名连接:
pd.merge(df1, df2, left_on="A", right_on="B")多字段连接:
on=["字段1", "字段2"]添加后缀区分重复列名:
suffixes=("_left", "_right")
【内连接】
【例3-17】订单表和用户表连接,获取每笔订单的用户姓名与性别
题目描述:请将 orders.csv 和 users.csv 按照 user_id 进行内连接,查询每笔订单的编号、下单日期、用户姓名与性别。
import pandas as pd
# 加载数据
orders = pd.read_csv("orders.csv")
users = pd.read_csv("users.csv")# 查看表orders
orders.sort_values(by="user_id").head()# 查看表users
users.sort_values(by="user_id").head()# 内连接两表:订单关联用户信息
merged = pd.merge(
orders,
users[["user_id", "user_name", "gender"]],
on="user_id",
how="inner"
)
# 查看连接表
merged.sort_values(by="user_id")注意:how="inner"为默认连接方式,可省略
【例3-18】查找所有明细订单及其评分
将 order_items.csv 与 product_ratings.csv ,内连接,使用order_id关联查看每条订单是否有评分记录。
import pandas as pd
# 读取数据
orders = pd.read_csv("order_items.csv")
ratings = pd.read_csv("product_ratings.csv")
# 使用内连接,只保留订单表中有对应评分的记录
merged = pd.merge(
orders,
ratings[["order_id", "rating"]],
on="order_id",
how="inner" # 只保留两边都有的数据
)
# 查看连接表
merged【左连接】
【例3-19】订单明细表与商品信息表连接,获取每条商品记录的名称与品牌
题目描述:将 order_items.csv 与 products.csv 按 product_id 连接,查询明细编号、商品名称、品牌与购买数量。
items = pd.read_csv("order_items.csv")
products = pd.read_csv("products.csv")
# 从商品表中选择所需字段(商品编号、名称、品牌),按 product_id 与订单明细表进行左连接
# 左连接含义:保留订单明细中所有记录,同时补充对应商品的名称与品牌信息
merged = pd.merge(
items,
products[["product_id", "product_name", "brand"]],
on="product_id",
how="left"
)
# 查看连接表
merged【例3-20】查找每个用户的浏览记录(包括没有浏览记录的用户)
说明:将 users.csv 与 browsing_logs.csv 左连接,查看用户姓名、性别及行为(如有)。
users = pd.read_csv("users.csv")
logs = pd.read_csv("browsing_logs.csv")
# 左连接两表:
# 以 user_id 为键,将用户表与日志表连接,
# 保留所有用户,即使该用户没有任何行为记录也会保留
merged = pd.merge(
users[["user_id", "user_name", "gender"]],
logs[["user_id", "product_id", "action_type"]],
on="user_id",
how="left"
)
# 查看连接表
merged【例3-21】统计每位用户的浏览次数
题目说明:在电商平台中,用户的浏览行为反映了其活跃程度和兴趣偏好。本例要求通过分析用户行为日志 browsing_logs.csv,统计每位用户的“浏览”行为次数,并结合用户信息表 users.csv 输出用户编号、姓名及其浏览次数。
import pandas as pd
# 1. 读取数据
users = pd.read_csv("users.csv")
logs = pd.read_csv("browsing_logs.csv")
# 2. 左连接:合并用户信息与行为日志(保留所有用户)
merged = pd.merge(
users[["user_id", "user_name", "gender"]],
logs[["user_id", "action_type"]],
on="user_id",
how="left"
)
# 3. 仅保留“浏览”行为记录
browsing_only = merged[merged["action_type"] == "浏览"]
print(browsing_only)
# 4. 按 user_id 分组统计浏览次数
browse_counts = browsing_only.groupby(["user_id", "user_name"]).size().reset_index(name="浏览次数")
browse_counts3.6 数据透视表
一、教学内容
掌握 pandas.pivot_table() 方法,完成商品销售、用户行为等关键指标的透视分析。
在 Pandas 中,
pivot_table就像 Excel 的数据透视表,用来“
按行列分类对数据进行统计汇总”对一张表中的数据进行“
分组 → 聚合 → 汇总 → 交叉展示”。
二、教学目标
| 类型 | 教学目标说明 |
|---|---|
| 知识目标 | 理解数据透视表的结构组成:行、列、值、聚合函数 |
| 能力目标 | 能够针对订单与明细数据构建基本的数据透视表 |
| 应用目标 | 学会通过透视表分析商品热度、地区销售、用户偏好等 |
Pandas 数据透视表(pivot_table)语法总结👇
三、数据透视表语法总结
1. 基本语法格式
pd.pivot_table(
data, # 数据源:DataFrame
index=None, # 行索引字段(可多个),按哪个字段分组(类似 Excel 行标签)
columns=None, # 列索引字段(可选),按哪个字段分列显示(类似 Excel 列标签)
values=None, # 统计的数值字段
aggfunc='mean', # 分组聚合函数(默认平均值,可改为 sum、count、max、min 等)
margins=False, # 是否添加汇总行/列(True/False) /ˈmɑːrdʒɪnz/
fill_value=None, # 缺失值填充(避免结果中出现 NaN)
)2. 参数说明表
| 参数名 | 含义 | 示例值 | 说明 |
|---|---|---|---|
data | 数据源 | merged | 要分析的 DataFrame |
index | 行索引 | 'category' | 按哪个字段分组(类似 Excel 行标签) |
columns | 列索引 | 'city' | 按哪个字段分列显示(类似 Excel 列标签) |
values | 值字段 | 'quantity' | 要进行统计计算的字段 |
aggfunc | 聚合函数 | 'sum'、'mean'、'count' | 如何对每个分组计算 |
margins | 汇总总计 | True | 是否显示总计行/列 |
fill_value | 缺失值填充 | 0 | 避免结果中出现 NaN |
3. 常见聚合函数示例
| 聚合函数 | 功能说明 | 示例用途 |
|---|---|---|
'sum' | 求和 | 各类商品总销量 |
'mean' | 平均值 | 每类商品平均价格 |
'count' | 计数 | 每类订单数量 |
'max' | 最大值 | 最高成交额 |
'min' | 最小值 | 最低价格 |
4. 小结口诀
行是谁 → 列是谁 → 统计什么 → 怎么算
对应语法:
pd.pivot_table(data, index=行, columns=列, values=值, aggfunc=函数)
5.对应参数理解
| 思考问题 | 对应参数 | 举例说明 |
|---|---|---|
| 我要按什么分组统计? | index | 比如按“商品类别”统计,就写 index="category" |
| 是否要分列显示? | columns | 比如按“地区”分列,就写 columns="region" |
| 我要统计哪个字段? | values | 比如统计“销量”,就写 values="quantity" |
| 要怎么算? | aggfunc | 比如要求总和就写 'sum',求平均就写 'mean' |
它的“表头结构”由
index和columns决定, 它的“表格内容”由values和aggfunc决定。
四、实验数据
主要用到以下表:
order_items:订单明细数据(商品、数量、折扣)orders:订单主表(支付方式、订单状态、城市)products:商品表(分类、品牌、价格)
五、实验步骤
【例3-22】前导步骤:导入数据并合并订单明细与商品信息
合并结果:把订单明细、商品信息、订单主表整合到一张大表里,每行是一条订单明细的完整记录。
import pandas as pd
# 读取订单明细与商品信息
order_items = pd.read_csv("order_items.csv")
orders = pd.read_csv("orders.csv")
products = pd.read_csv("products.csv")
# 合并订单明细 + 商品表 + 订单主表
merged = order_items.merge(products, on="product_id").merge(orders, on="order_id")
merged.head()【例3-23】按商品分类统计销售数量
承接:先做单维汇总,理解
index / values / aggfunc的最小用法。
# 基于商品分类统计总销量
# 使用 Pandas 的 pivot_table 函数创建数据透视表
pivot1 = pd.pivot_table(
merged, # 数据来源:已合并的 DataFrame,包含订单明细、商品信息等
index='category', # 行索引:按商品分类(category)来统计
values='quantity', # 值字段:统计每类商品的销量(quantity)
aggfunc='sum' # 聚合函数:对每个分类的销量进行求和,计算总销量
)
# 按销量从高到低排序(此时列名就叫 'quantity',可直接排序)
pivot1.sort_values(by='quantity', ascending=False)
index= 分类依据(“按谁分组”)values= 统计目标(“统计什么”)aggfunc= 统计方式(“怎么算”)
📌 分析问题:哪个类别商品销量最高?
建议使用EXCEL的数据透视表工具来对比
1.先截取前1000行并导出为 CSV 文件作演示用
merged.head(1000).to_csv("merged_1000.csv", index=False, encoding="utf-8-sig")2.在excel中使用数据透视表演示
【例3-24】按“分类 × 城市”统计总销量(双维度交叉)
承接:把分类(行)*与*城市(列)*同时放入透视表,形成“交叉表”。 在这个基础上,演示*取值、求总、排序等操作。
# 任务:基于商品分类和城市统计总销量
# 功能:使用 Pandas 的 pivot_table() 方法创建数据透视表,
# 按“商品分类(category)”和“配送城市(delivery_city)”进行分组,
# 统计各分类在不同城市的销售数量(quantity)总和。
# 使用 Pandas 的 pivot_table 函数创建数据透视表
pd.pivot_table(
merged, # 数据来源:已合并的 DataFrame,包含订单明细、商品信息、订单主表等完整数据
index='category', # 行索引(index):以“商品分类”为行标签,表示每个分类一行
columns='delivery_city', # 列索引(columns):以“配送城市”为列标签,展示各城市的销售情况
values='quantity', # 值字段(values):要统计的数值列,这里是销量(quantity)
aggfunc='sum', # 聚合函数(aggfunc):采用求和方式,对每个分类在各城市的销量进行汇总
margins=True # 添加汇总行/列
)
index→ “谁是行标签”
columns→ “谁是列标签”
values→ “统计哪个数”
aggfunc→ “怎么算”
margins→ “要不要加总计”
fill_value→ “空的地方填什么”

行索引(index):左侧纵向的“商品分类”;
列索引(columns):上方横向的“城市”;
行索引名(category):由
index='category'生成;列索引名(delivery_city):由
columns='delivery_city'生成;All 行/列:由
margins=True自动添加的汇总结果。
【例3-25】不同省份的订单数量对比(区域销售分析)
承接:从“分类维度”切到“地域维度”,换一个业务指标(订单数)。
# 基于收货城市统计订单数量
pivot2 = pd.pivot_table(
merged, # 数据来源:合并后的订单明细数据 merged,包含订单和收货地址等信息
index='delivery_city', # 行索引:以收货城市(delivery_city)进行分类
values='order_id', # 值字段:使用订单 ID(order_id)字段作为计数对象
aggfunc='count' # 聚合函数:统计每个城市的订单数量
)
# 将结果按订单数量降序排序并显示
pivot2.sort_values(by='order_id', ascending=False)📌 分析问题:哪些省份是主要销售区域?
【例3-26】商品品牌与支付方式交叉分析(二维透视)
统计每个品牌的商品,用户通过哪种支付方式买单的次数。
# 使用 Pandas 的 pivot_table 函数生成数据透视表
pivot3 = pd.pivot_table(
merged, # 数据来源:合并后的 DataFrame,通常包含订单、商品、支付方式等信息
index='brand', # 行索引:以商品品牌(brand)进行分类
columns='payment_method', # 列索引:以支付方式(payment_method)展开,如微信、支付宝、信用卡
values='order_id', # 值字段:统计订单编号
aggfunc='count', # 聚合函数:统计每个品牌每种支付方式的订单数量
fill_value=0 # 填充值:若某品牌下某支付方式没有订单,填充为0,避免出现 NaN
)
# 输出透视表结果
pivot3index = 分类依据(“按品牌分组,比如 Apple、华为、小米”)
columns = 列分类(“按支付方式展开,比如 微信、支付宝、信用卡”)
values = 统计目标(“统计订单数量,使用 order_id”)
aggfunc = 统计方式(“用 count 计数,算每个品牌在不同支付方式下有多少订单”)
fill_value = 填充值(“没有订单的地方填 0”)

📌 分析问题:用户用什么支付方式购买了哪些品牌的商品?
【例3-27】基于商品分类的销售金额加权统计分析
# 新增字段:计算每一行订单明细的实际销售金额
# 实际销售额 = 单价 × 数量 × 折扣系数
merged['sales_amount'] = (merged['unit_price'] * merged['quantity'] * merged['discount'])
# 基于商品分类,对销售金额进行加权统计(即加总每类商品的实际销售额)
pivot4 = pd.pivot_table(
merged, # 数据来源:含价格、数量和折扣字段的订单明细
index='category', # 行索引:以商品分类(category)分类
values='sales_amount', # 值字段:统计新计算的销售金额字段
aggfunc='sum' # 聚合函数:对每类商品的销售额求和
)
# 将结果按销售金额降序排列
pivot4_sorted = pivot4.sort_values(by='sales_amount', ascending=False)
# 设置显示格式:不使用科学计数法
pd.options.display.float_format = '{:,.2f}'.format
# 输出排序后的销售金额透视表
pivot4_sorted