李翔-大数据技术

Big data technology!

第3章 数据分析

第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 改为 nameregister_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 列,并将 cityuser_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.csvunit_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.csvcategory 进行分组,统计每个类别下的商品数量

# 方法一
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.csvproduct_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.csvusers.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.csvproduct_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.csvbrowsing_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_counts


3.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'


它的“表头结构”由 indexcolumns 决定, 它的“表格内容”由 valuesaggfunc 决定。


四、实验数据

主要用到以下表:

  • 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 → “空的地方填什么”

image-20251017110937973

  • 行索引(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
)

# 输出透视表结果
pivot3

index = 分类依据(“按品牌分组,比如 Apple、华为、小米”)

columns = 列分类(“按支付方式展开,比如 微信、支付宝、信用卡”)

values = 统计目标(“统计订单数量,使用 order_id”)

aggfunc = 统计方式(“用 count 计数,算每个品牌在不同支付方式下有多少订单”)

fill_value = 填充值(“没有订单的地方填 0”)

image-20251017111051085

📌 分析问题:用户用什么支付方式购买了哪些品牌的商品?


【例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



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1