2.1 项目背景
随着互联网和移动支付的普及,电子商务行业飞速发展,用户数量、商品规模和订单数据不断增长。在这种背景下,电商平台积累了海量的用户行为与交易数据,为深入开展用户画像、精准营销、商品推荐、销售预测等提供了强有力的数据基础。
作为一名初级数据分析师,你刚加入了一家大型电商公司,接到的第一个任务是:对平台近几年的运营数据进行初步分析,发现有价值的商业信息,并以图表方式进行展示,支持运营决策。
公司为你提供了一组模拟数据,包括:
用户注册信息(
users表)商品库(
products表)订单信息与订单明细(
orders和order_items表)用户行为日志(
browsing_logs表)商品评分记录(
product_ratings表)
你需要对这批数据进行读取、清洗、分析与可视化,完成以下问题探索:
分析任务:
平台用户的性别与年龄分布特征如何?是否存在特定城市或省份的用户占比较高?
平台哪些商品销量最好?不同类别的畅销品牌有哪些?
用户行为(浏览、加购、收藏)是否对订单转化有促进作用?
评分较高的商品是否也有较高的销量?是否存在热门但评分低的商品?
能否以清晰直观的图表方式向领导汇报这些洞察结果?
2.2 技能图谱
Pandas 数据处理
│
├── 1. 数据读取
│ ├── pd.read_csv()
│ ├── 常用参数:
│ │ ├── index_col
│ │ ├── parse_dates
│ │ ├── dtype
│ │ ├── nrows
│ │ └── encoding
│
├── 2. 数据结构查看
│ ├── df.shape → 行列规模
│ ├── df.columns → 列名
│ ├── df.dtypes → 每列数据类型
│ ├── df.head() → 前几行
│ └── df.info() → 数据整体概况
│
├── 3. 数据访问与筛选
│ ├── [] 中括号语法
│ │ ├── 单列 / 多列选择
│ │ ├── 行切片(0:5)
│ │ └── 条件过滤(df[df["条件"]==值])
│ ├── .loc[] 标签定位
│ │ ├── df.loc[行标签, 列名]
│ │ └── 支持布尔筛选 + 指定列
│ ├── .iloc[] 位置定位
│ │ ├── df.iloc[行位置, 列位置]
│ │ └── 左闭右开,不支持条件筛选
│ └── .query() 表达式查询
│ ├── df.query("列名 条件")
│ ├── 支持 and / or / not
│ └── 支持 @变量 和 反引号字段
│
└── 4. 应用任务场景
├── 用户画像分析(users)
├── 商品热度排行(products + order_items)
├── 销售趋势分析(orders)
├── 用户行为转化(browsing_logs)
└── 评分与推荐基础(product_ratings)
2.2.1 Python 数据处理核心库
NumPy
定义:用于科学计算的 Python 库,提供高效的多维数组与数学运算功能。
作用:适合处理大规模的数值数据,特别是矩阵和向量运算。
特点:
提供高性能的
ndarray多维数组;内置丰富的数学函数,如加减乘除、线性代数等;
内存占用小,运行速度快。
Pandas
定义:专为数据分析设计的 Python 库,擅长处理表格型数据,类似 Excel。
作用:用于数据清洗、转换、分析与可视化,是数据科学中的核心工具。
特点:
核心数据结构:
DataFrame(二维表)、Series(一维序列);支持灵活操作:筛选、聚合、合并、重塑等;
具备数据清洗能力:处理缺失值、重复值;
可与 NumPy、Matplotlib 等无缝集成。
总结:
NumPy 侧重数值计算,Pandas 专注数据分析。
它们常常配合使用,是数据分析入门的基础工具组合。
2.2.2 Pandas数据结构
DataFrame 和 Series 总结
Pandas 数据结构:DataFrame(二维带标签表格),Series(一维带标签数据结构)

Pandas DataFrame 结构图解释
总体结构:
DataFrame 是一个二维表格型数据结构,类似 Excel 表或 SQL 表格;
每一列可包含不同类型的数据,如数字、文本、布尔值等。
轴标签(Axis Labels):
行索引(Index):
图中左侧的蓝色条形区域,用于标识每一行,默认从 0 开始,可自定义为日期、编号等。
列名(Columns):
图中顶部的橙色区域,用于标识每一列,在数据操作中用于定位或引用列。
数据区域:
位置:位于中间的网格区域【图中的浅灰色网格区域】,存储具体的数据。
作用:每个值可通过“行索引 + 列名”访问。
单列结构:Series:
Series:
从 DataFrame 中选取某一列,会返回一个 Series(一维带索引的结构);
Series 类似数组,保留行索引,可单独分析处理列数据。
轴方向(Axis Direction):
轴0:指的是行方向,通常用于跨行的操作,如计算总和、平均值等。
轴1:指的是列方向,通常用于跨列的操作,如添加或删除列等。
总结:
DataFrame = 行索引 + 列标签 + 数据网格 + 支持灵活选取和运算的二维表结构
应用示例:
索引和选择数据:
# 导入库,pandas 是常用的数据分析库
import pandas as pd
# 准备数据:使用字典存储,字典由“键: 值”组成
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 22],
'城市': ['北京', '上海', '广州']
}
# 将字典转换成 DataFrame(数据表格)
df = pd.DataFrame(data)
# 选择 DataFrame 的单列(这里是“姓名”列),结果是 Series(一列数据)
series = df['姓名']
# 输出结果
print("输出 DataFrame:")
print(df)
print("输出 Series:")
print(series)

DataFrame 和 Series 总结对比
| 对比项 | DataFrame(数据表格) | Series(一列数据) |
|---|---|---|
| 数据结构 | 二维结构(行 × 列),就像 Excel 表格 | 一维结构,只有一列,像列表/数组 |
| 索引结构 | 有行号(行索引) + 列名(表头) | 只有行号(行索引) |
| 数据类型 | 每列内部类型一致,不同列可以不一样(比如姓名是文本,年龄是数字) | 通常都是同一类型(整列都是数字或都是文本) |
| 应用场景 | 适合处理完整的表格数据,常用于数据清洗、统计和分析 | 适合处理单列数据,快速访问、绘图或计算平均值等 |
| 组成关系 | DataFrame 是由多列 Series 组合而成,每一列都是一个 Series | Series 是 DataFrame 的“列”,也可以单独存在 |
| 操作方式 | 通过 df['列名'] 获取一列(Series),也能切片、分组、聚合等复杂操作 | 从 DataFrame 提取得到,或者多个 Series 拼成表格 |
举例

2.3 数据获取
【数据下载:】https://wwtf.lanzoul.com/ijbQ535g2jri
本教程涉及的数据及其结构的描述:
数据表简介
| 表名 | 数据量 | 用途说明 |
|---|---|---|
users | 10,000 条 | 模拟电商平台注册用户,支持用户画像、活跃度分析、分群建模等任务 |
products | 1,000 条 | 商品库,含多类目、品牌、价格区间,支持分类推荐、销量排行等分析 |
orders | 500,000 条 | 订单主表,每个用户 7~15 单,时间覆盖 2020–2024 年,支持销售趋势分析 |
order_items | 1,500,000 条 | 每单含 1~5 个商品,构成明细表,支持订单金额聚合、商品偏好分析等任务 |
browsing_logs | 2,000,000 条 | 用户行为日志(浏览、加购、收藏),支持转化路径分析与推荐系统建模 |
product_ratings | 500,000 条 | 商品评分数据,购买用户评价,支持协同过滤、热度分析等挖掘任务 |
表1:users (用户信息表)
| 字段名 | 类型 | 含义说明 | 示例 |
|---|---|---|---|
user_id | STRING | 用户唯一编号(U+编号) | U0001 |
user_name | STRING | 用户姓名(中文,随机生成) | 王小明 |
gender | STRING | 性别(男 / 女) | 男 |
age | INT | 年龄(18 ~ 60岁) | 28 |
register_date | DATE | 注册时间(2020~2024之间) | 2021-06-01 |
city | STRING | 注册城市(中国主要城市) | 广州 |
province | STRING | 所在省份(对应城市的上级) | 广东 |
表2:products(商品信息表)
| 字段名 | 类型 | 含义说明 | 示例 |
|---|---|---|---|
product_id | STRING | 商品唯一编号(P+编号) | P0001 |
product_name | STRING | 商品名称(品牌+名称模板) | 小米手机 |
category | STRING | 商品所属类别(6大类) | 手机数码类 |
unit_price | FLOAT | 商品当前单价(单位:元) | 1999.00 |
brand | STRING | 品牌名称 | 小米 |
表3:orders(订单信息表)
| 字段名 | 类型 | 含义说明 | 示例 |
|---|---|---|---|
order_id | STRING | 订单编号,唯一标识每笔交易 | O202406010001 |
user_id | STRING | 下单用户的唯一编号(关联 users 表) | U0000001 |
order_date | DATE | 下单时间,不能早于注册时间 | 2023-11-21 |
payment_method | STRING | 支付方式,如"微信", "支付宝", "信用卡", "货到付款", "花呗"等 | 微信支付 |
order_status | STRING | 订单状态,如“完成”或“取消” | 完成 |
delivery_city | STRING | 收货城市 | 杭州 |
delivery_type | STRING | 配送方式,如快递、自提、上门服务等 | 快递 |
表4:order_items(订单明细表)
| 字段名 | 类型 | 含义说明 | 示例 |
|---|---|---|---|
item_id | STRING | 明细编号(唯一,格式 OI+6位编号) | OI000001 |
order_id | STRING | 所属订单编号,外键关联 orders 表 | O202406010001 |
product_id | STRING | 商品编号,外键关联 products 表 | P0001 |
quantity | INT | 购买数量(每种商品 1~5件) | 2 |
discount | FLOAT | 商品折扣(浮点数,0.8~1.0) | 0.90 |
表5:browsing_logs(用户行为日志)
| 字段名 | 类型 | 含义说明 | 示例 |
|---|---|---|---|
log_id | STRING | 日志编号,唯一标识一条行为记录 | LOG0000001 |
user_id | STRING | 用户编号,外键关联 users 表 | U0000001 |
product_id | STRING | 商品编号,外键关联 products 表 | P0001 |
browse_time | TIMESTAMP | 用户行为发生的时间戳(含时分秒) | 2024-01-01 10:22:33 |
action_type | STRING | 行为类型,如“浏览”、“收藏”、“加购”、”下单“、”成交“ | 浏览 |
表6:product_ratings(商品评分表)
| 字段名 | 类型 | 含义说明 | 示例 |
|---|---|---|---|
rating_id | STRING | 主键,全局唯一评分记录编号 | r0000001 |
order_id | STRING | 所属订单编号,外键关联 orders 表 | O202406010012 |
user_id | STRING | 用户编号,外键关联 users 表 | U000001 |
product_id | STRING | 商品编号,外键关联 products 表 | P0001 |
rating | INT | 用户评分值(1~5 星) | 4 |
rating_time | TIMESTAMP | 评分时间(下单后0~15天内,精确到秒) | 2024-03-02 15:34:11 |
2.4 数据读入
前期准备:
在每个班级的工作目录下(如 D:/bigdata1/),新建子目录 DataAnalysis。
2.放置数据文件 将实验所需的数据集文件复制到 DataAnalysis 目录中。
3.进入实验目录 打开命令行Anaconda Prompt,切换到目录:
D:/bigdata1/DataAnalysis
4.启动 Jupyter Notebook 在该目录下启动 Jupyter Notebook,准备开始实验。
【知识点】
1. 基本读取语法:
# 导入 pandas 库并简写为 pd,用于数据处理与分析
import pandas as pd
# 读取 CSV 文件并将其存为 DataFrame 格式,赋值给变量 df
df = pd.read_csv("文件名.csv")
2. 常用参数说明:
| 参数 | 功能说明 | 示例 |
|---|---|---|
filepath | 要读取的CSV文件路径 | "D:/users.csv" |
encoding | 指定编码,避免乱码 | encoding="utf-8" 或 "gbk" |
header | 设置列名行号。None 表示无列名 | header=None |
names | 自定义列名(常与 header=None 搭配) | names=["列1", "列2", "列3"] |
index_col | 指定某列作为索引 | index_col=0 或 index_col="user_id" |
parse_dates | 指定将某列转换为日期格式 | parse_dates=["register_date"] |
nrows | 只读取前N行(用于预览大文件) | nrows=100 |
sep | 指定分隔符,默认逗号,可改为 |、\t 等 | |
dtype | 指定列的数据类型 | dtype={"user_id": str} |
【例 2-1】读取用户信息表 users.csv,预览前5行。
需要提前把下面要读取的各表放置到工作目录中
import pandas as pd
users = pd.read_csv("users.csv")
users.head()
如果
products.csv文件的 第一行有列标题,pd.read_csv会 自动把第一行识别为 DataFrame 的列名。
【例 2-2】读取商品信息表 products.csv,并将商品编号设为索引列。
products = pd.read_csv("products.csv", index_col="product_id")
products.head()
语法重点:
index_col设置索引列,便于后续按商品编号查询。在 Pandas 中定义索引的作用是:为数据行提供标签,用于快速定位、切片和对齐,提升查询效率和可读性
对照语句
products = pd.read_csv("products.csv")的结果有什么区别
【例 2-3】读取订单表 orders.csv,只加载前100行进行预览。
orders = pd.read_csv("orders.csv", nrows=100)
orders
【例 2-4】读取评分表 product_ratings.csv,并将 rating_time 字段转为时间格式。
ratings = pd.read_csv("product_ratings.csv", parse_dates=["rating_time"])
ratings.dtypes
语法重点:
parse_dates使得时间字段支持.dt.year等操作。对照语句
ratings = pd.read_csv("product_ratings.csv")的结果有什么区别?
【例 2-5】读取用户表 products.csv,将 unit_price 设置为浮点类型。
products = pd.read_csv("products.csv", dtype={'unit_price': float})
products.dtypes
语法重点:
dtype用于控制数据类型转换。对照语句
products = pd.read_csv("products.csv")的结果有什么区别?
2.5 数据检查
【知识点】
以下是对 Pandas 中 DataFrame 结构常用查看属性的总结:
| 操作目标 | 常用语法 | 返回内容 |
|---|---|---|
| 数据总规模 | df.shape | (行数, 列数) |
| 获取行数 | df.shape[0] | 返回行数(int) |
| 获取列数 | df.shape[1] | 返回列数(int) |
| 查看列名 | df.columns | 返回所有列标签(Index 对象) |
| 查看数据类型 | df.dtypes | 每列数据的类型信息 |
【例 2-6】读取用户信息表 users.csv,并输出数据的总行数与列数。
import pandas as pd
users = pd.read_csv("users.csv")
print("数据规模为:", users.shape)语法重点: shape 返回 (行数, 列数),可快速了解数据体量。
【例 2-7】读取商品信息表 products.csv,并打印所有列名。
products = pd.read_csv("products.csv")
print("列名为:", products.columns)语法重点: columns 返回的是一个列名的 Index 对象,可以使用 list(products.columns) 转换为列表。
【例 2-8】读取订单主表 orders.csv,并输出数据的总行数。
orders = pd.read_csv("orders.csv")
print("订单记录数为:", orders.shape[0])语法重点: shape[0] 获取总行数,用于记录数统计。
【例 2-9】读取订单明细表 order_items.csv,并输出总列数。
order_items = pd.read_csv("order_items.csv")
print("字段数量为:", order_items.shape[1])语法重点: shape[1] 获取总列数,常用于表结构审查。
【例 2-10】读取评分表 product_ratings.csv,并查看所有字段的数据类型。
ratings = pd.read_csv("product_ratings.csv", parse_dates=["rating_time"])
print(ratings.dtypes)
语法重点: dtypes 可以区分数值、字符串、日期等字段类型,后续处理前非常重要。
2.6 数据内容访问
2.6.1 采用[]操作符访问数据
【知识点】
Pandas 中的 [] 操作符主要用于:
列选择
行切片
按条件筛选行
❗注意:[] 不能同时选中“行和列”,想实现需用 .loc 或 .iloc。
一、列选择
| 类型 | 示例语法 | 返回类型 | 说明 |
|---|---|---|---|
| 单列 | df["列名"] | Series | 返回一列 |
| 多列 | df[["列1", "列2"]] | DataFrame | 返回多个列,列顺序可自定 |
二、行切片(行号)
| 类型 | 示例语法 | 说明 |
|---|---|---|
| 行范围选择 | df[0:5] | 取第0~4行,区间为左闭右开 |
| 前n行 | df[:n] | 取前n行 |
| 后n行 | df[-n:] | 取最后n行(不推荐,建议用 .tail()) |
三、按条件筛选(行过滤),也叫布尔索引
| 类型 | 示例语法 | 说明 |
|---|---|---|
| 单条件 | df[df["gender"] == "男"] | 选出性别为“男”的所有行 |
| 多条件 | df[(df["gender"]=="女") & (df["city"]=="上海")] | 满足多个条件需要用括号包裹 |
| 使用逻辑或 | df[(df["age"] < 25) | 选出小于25岁的所有行 |
四、特别提醒(不能做的事)
❌ df[1:5, ["列1", "列2"]] 是不合法的语法 —— 不能同时使用 [] 对行和列进行选择,需使用 .loc 或 .iloc 实现。
【例 2-11】读取用户信息表 users.csv,选择所有用户的 user_name 列。
import pandas as pd
# 读取 users.csv 文件,并将其存为 DataFrame 对象 users
users = pd.read_csv("users.csv")
users["user_name"]语法重点: df["列名"] 可选取单列,返回 Series 类型。
【例 2-12】从商品信息表 products.csv 中选择 product_name 和 unit_price 两列。
products = pd.read_csv("products.csv")
products[["product_name", "unit_price"]]语法重点: 多列选择需使用双层中括号 [["列1", "列2"]],返回 DataFrame 类型。
【例 2-13】选取订单表 orders.csv 中前100行数据进行查看。
orders = pd.read_csv("orders.csv")
orders[:100]语法重点: df[start:end] 用于按行切片(默认按行号),左闭右开。
【例 2-14】从用户表中筛选出所有“广州”注册的用户信息。
users = pd.read_csv("users.csv")
# 筛选 city 列中值为 "广州" 的所有行,返回包含广州用户的子表
users[users["city"] == "广州"]语法重点:
通过布尔索引,
users["city"] == "广州"生成一个布尔序列,用于从 DFrame 中筛选出满足条件的行。条件过滤需写成
df[布尔条件],等于号不能写成=,而是==。总结 :先取列 → 比较条件 → 得到布尔值 → 用布尔值筛选行。
【例 2-15】从商品表中筛选出“手机数码类”类别且价格低于2000元的商品。
products = pd.read_csv("products.csv")
products[(products["category"] == "手机数码类") & (products["unit_price"] < 2000)]语法重点:
多条件筛选用
&(与)、|(或);每个条件外都要加括号
( );字符串比较用
==,数值比较用<,>,>=等。

【例 2-16】从评分表中选出评分为 5 分的记录,并查看对应的 user_id 和 product_id。
# 读取商品评分数据,存入 DataFrame ratings
ratings = pd.read_csv("product_ratings.csv")
# 筛选评分等于 5 的记录,并提取其中的 user_id 和 product_id 两列
ratings[ratings["rating"] == 5][["user_id", "product_id"]]语法重点:
条件筛选后再列选择要用链式写法:
df[条件][["列1", "列2"]];也可以使用
.loc替代进行更安全的行列同时选取(详见3.6.2)。
【例 2-17】从浏览日志中选取前10行,查看 user_id 和 action_type。
logs = pd.read_csv("browsing_logs.csv")
print(logs[:10][["user_id", "action_type"]])语法重点: 行切片后可以再进行列选择,用于快速预览重点字段。
【练习题】
练习 2-1:选取用户表中部分列
从 users.csv 中选择 user_id、age 两列,查看前 8 行。
👉 提示:先列选择,再行切片。
import pandas as pd
users = pd.read_csv("users.csv")
# 先选两列,再切片前8行
users[["user_id", "age"]][:8]
练习 2-2:订单数据的多条件筛选
在 orders.csv 中,筛选出:
order_status为"完成",且
payment_method为"微信支付"的订单。
👉 提示:两个条件需要用 &,条件外要加小括号 ( )。
orders = pd.read_csv("orders.csv")
# 订单状态为完成 且 支付方式为微信支付
orders[(orders["order_status"]=="完成") & (orders["payment_method"]=="微信支付")]
练习 2-3:订单明细中的数量过滤
读取 order_items.csv,选出购买数量 quantity >= 3 的记录,并查看 order_id 和 product_id 两列。
items = pd.read_csv("order_items.csv")
# 数量大于等于 3
items[items["quantity"] >= 3][["order_id", "product_id"]]
练习 2-4:用户行为日志取样
从 browsing_logs.csv 中取最后 5 行,显示其中的 user_id、product_id、action_type。
👉 提示:用 [-5:] 或 .tail(5)。
logs = pd.read_csv("browsing_logs.csv")
# 取最后5行,并选择部分列
logs.tail(5)[["user_id", "product_id", "action_type"]]练习 2-5:评分数据筛选
在 product_ratings.csv 中,找出所有评分为 1 或 2 的差评,查看 user_id、product_id 和 rating_time 三列。
👉 提示:用逻辑或 |。
ratings = pd.read_csv("product_ratings.csv")
# 筛选差评:评分为1或2
ratings[(ratings["rating"]==1) | (ratings["rating"]==2)][["user_id", "product_id", "rating_time"]]
2.6.2 采用.iloc或.loc方式
【知识点】
基本概念对比
| 方法 | 索引方式 | 使用规则 | 适用场景 |
|---|---|---|---|
.loc | 标签索引 | 用行/列的“名字”进行选择 | 根据列名或行名选取 |
.iloc | 位置索引 | 用行/列的“数字位置”进行选择 | 按顺序、位置精确选取 |


loc 和 iloc 是 Pandas 中用于数据选择和操作的两种主要方法。它们的用法各有特点,具体如下:
loc 语法:loc 是基于标签(label)的选择方法,允许通过行和列的标签来选择数据。
用法
df.loc[row_labels, column_labels]
行选择:通过
标签选择行,通常使用行索引标签,可以是单个标签、标签列表、标签范围,或者布尔索引。列选择:通过
列名选择列。支持布尔索引:可用于基于条件的过滤。
示例
# 选择单行
df.loc[0] # 选择行索引标签为 0 的行
# 选择多行
df.loc[0:5] # 选择行索引标签从 0 到 5 的行(包含 5)
# 选择单列
df.loc[:, 'City'] # 选择名为 'City'的列,等同于df['City']
# 选择多列
df.loc[:,['City','AvgTemperature']] # 等同于df[['City','AvgTemperature']]
# 条件选择
df.loc[df['AvgTemperature'] > 100] # 选择满足条件的行,等同于df[df['AvgTemperature'] > 100]
iloc 语法
iloc 是基于整数位置(index)的数据选择方法。
iloc 的整数位置指的是行或列在 DataFrame 中的位置索引
位置索引(整数位置):是指行或列在 DataFrame 中的实际物理位置,从 0 开始递增的整数。这个是
iloc用来定位行或列的依据。
用法
df.iloc[row_positions, column_positions]
行选择:通过整数位置选择行。
列选择:通过整数位置选择列。
示例
# 选择单行
df.iloc[0] # 选择位置为 0 的行
# 选择多行
df.iloc[0:5] # 选择位置从 0 到 4 的行(不包含 5)
# 选择单列
df.iloc[:, 0] # 选择位置为 0 的列(即第1列)
# 选择多列
df.iloc[:, [0, 1]] # 选择位置为 0 和 1 的两列,(即第1、2列)
# 选择特定行和列
df.iloc[0:5, 0:2] # 选择前 5 行和前 2 列
loc和iloc的区别

loc和iloc总结
| 对比点 | .loc[] | .iloc[] |
|---|---|---|
| 使用方式 | df.loc[行标签, 列标签] | df.iloc[行位置, 列位置] |
| 行列索引类型 | 标签(字符串/名称) | 整数位置(从0开始) |
| 切片范围 | 左闭右闭(包含结束) | 左闭右开(不包含结束) |
| 是否支持条件 | ✅ 支持条件筛选 | ❌ 不直接支持条件筛选 |
loc
基于标签(Label-based): 使用行标签和列标签进行访问。
适用于行标签和列标签: 可以使用行标签(行名)和列标签(列名)来选择数据。
包含结束点: 切片选择时包含结束点,遵循
左闭右闭的原则。
iloc
基于位置(Integer-location based): 使用行索引和列索引进行访问。
适用于整数位置索引: 可以使用整数索引来选择数据,索引从0开始。
不包含结束点: 切片选择时不包含结束点,遵循
左闭右开的原则。
主要区别
索引类型:
loc使用标签索引,iloc使用整数位置索引。结束点:
loc的切片选择包含结束点,iloc的切片选择不包含结束点。适用范围:
loc适用于标签索引,适合处理带有自定义行标签的DataFrame;iloc适用于整数位置索引,适合处理需要按位置选择数据的场景。
注意:
如果在创建 DataFrame 时没有指定索引(index),Pandas 会自动使用整数索引(从 0 开始)作为行标签。在这种情况下,行标签和整数位置是相同的,因此可以使用 loc 或 iloc 进行索引,两者的效果相同。
loc方式(基于标签)
【例 2-18】从用户信息表 users.csv 中选出前5行的 user_name 和 city 列。
import pandas as pd
users = pd.read_csv("users.csv")
# 使用 loc 根据标签选取第 0 到第 4 行,列为 'user_name' 和 'city' 的数据
users.loc[0:4, ["user_name", "city"]]
语法重点: loc[行标签, 列标签],标签切片为左闭右闭,包含第4行。
等同于:users[0:4][["user_name", "city"]]
【例 2-19】从订单表 orders.csv 中筛选出支付方式为“花呗”的订单,查看 order_id 和 payment_method。
orders = pd.read_csv("orders.csv")
# 使用 .loc 进行条件筛选 + 列选择的操作,
# 语法:DataFrame.loc[行条件, 列名列表]:
orders.loc[orders["payment_method"] == "花呗", ["order_id", "payment_method"]]
语法重点: 支持条件筛选作为行索引,列名用列表形式。
等同于:orders[orders["payment_method"] == "花呗"][["order_id", "payment_method"]]
【例 2-20】从商品评分表中选出评分为5分的记录,并查看评分时间与商品编号。
ratings = pd.read_csv("product_ratings.csv")
ratings.loc[ratings["rating"] == 5, ["product_id", "rating_time"]]
语法重点: loc[布尔条件, [列名列表]] 是最常见的分析用法。
【例 2-21】筛选 30 岁以上的女性用户,并查看姓名与注册省份
users = pd.read_csv("users.csv")
result = users.loc[(users["age"] > 30) & (users["gender"] == "女"),
["user_name", "province"]]
result
语法要点:
多条件必须用
&且每个条件加括号.loc[布尔条件, 列名列表]是组合筛选常用写法
【例 2-22】从订单表中筛选“微信支付”且状态为“完成”的订单,并显示用户编号、下单时间
orders = pd.read_csv("orders.csv")
result = orders.loc[(orders["payment_method"] == "微信支付") & (orders["order_status"] == "完成"),
["user_id", "order_date"]]
result.head()
语法要点: 多条件查询 + 指定列输出,适合销售行为分析练习。
iloc方式(基于位置)
【例 2-23】从 products.csv 中选取前3行的前两列(即商品编号和商品名称)。
products = pd.read_csv("products.csv")
products.iloc[0:3, 0:2]
语法重点: iloc[行位置, 列位置],切片为左闭右开,不包含第3行和第2列。
【例 2-24】从用户表中选出第10~19行的第2、3列。
print(users.iloc[10:20, [1, 2]])
语法重点: 用列表 [1, 2] 指定多个列的位置。
【例 2-25】从订单明细表 order_items.csv 中选取前10行中前3列的数据。
items = pd.read_csv("order_items.csv")
items.iloc[:10, :3]
语法重点: 通过位置切片提取连续的行列范围,适合批量预览数据结构。
【练习题】
loc 练习题(基于标签)
【练习 2-6】从用户表中选取所有来自“广东省”的用户,显示 user_id 和 city。
users = pd.read_csv("users.csv")
result = users.loc[users["province"] == "广东", ["user_id", "city"]]
result.head()
语法要点: loc[条件, 列] 可以直接指定需要输出的字段。
【练习 2-7】从订单表中筛选 2023 年以后的订单,显示 order_id、order_date、delivery_city。
orders = pd.read_csv("orders.csv")
result = orders.loc[orders["order_date"] >= "2023-01-01",
["order_id", "order_date", "delivery_city"]]
result.head()
语法要点: 日期字段可以直接比较字符串(ISO 格式)。
【练习 2-8】从评分表中筛选评分小于 3 分的记录,并显示 user_id、product_id、rating。
ratings = pd.read_csv("product_ratings.csv")
low_ratings = ratings.loc[ratings["rating"] < 3, ["user_id", "product_id", "rating"]]
low_ratings.head()
语法要点: 支持小于号 < 条件筛选。
【练习 2-9】从商品表中选出 unit_price 大于 5000 的商品,显示商品名和品牌。
products = pd.read_csv("products.csv")
expensive = products.loc[products["unit_price"] > 5000, ["product_name", "brand"]]
expensive.head()
语法要点: 数值型字段可用于区间筛选。
iloc 练习题(基于位置)
【练习 2-10】从用户表中取前 5 行的第 1、4、5 列。
users.iloc[:5, [0, 3, 4]]
语法要点: 用列表 [列索引] 选择非连续列。
【练习 2-11】从订单表中取第 100~109 行(共 10 行),所有列。
orders.iloc[100:110, :]
语法要点: : 表示“所有列”。
【练习 2-12】从商品评分表中选取最后 10 行的第 0~2 列。
ratings.iloc[-10:, 0:3]
语法要点: 负数索引 -10: 表示“倒数第10行到最后”。
【练习 2-13】从订单明细表中选取第 20 行到第 25 行的 product_id 和 quantity 列(假设这两列是第 2、3 列)。
items.iloc[20:26, [2, 3]]
语法要点: iloc 必须用整数位置,不能写列名。
2.6.3 采用表达式方式
【知识点】
df.query() 是 Pandas 提供的一种用于快速对 DataFrame 进行查询和过滤的简便方法。
# 语法
df.query('条件表达式')
# 举例:
df.query('Country == "China"')
条件表达式:可以是一个完整的布尔表达式字符串,用于定义查询条件。例如 Country == "China"。
注意
简洁性:使用字符串表达式进行查询,语法简单,代码更具可读性。
直接使用列名:在表达式中直接使用列名,不需要加引号或使用方括号。
逻辑运算符:支持使用
and、or、not等逻辑运算符,或者使用&、|和~。字符串处理:字符串值需要用双引号(
")括起来。带空格的列名:对于带有空格或特殊字符的列名,使用反引号(
``)括起来。动态变量:可以通过@` 符号在表达式中引用 Python 变量。
【例 2-26】从 users.csv 中查询所有注册城市为“广州”的用户信息
import pandas as pd
users = pd.read_csv("users.csv")
result = users.query('city == "广州"')
result
语法重点: 查询语句中列名可直接使用,字符串值必须用双引号 "..."。
【例 2-27】从 products.csv 中查询价格低于 1000 元的商品名称和价格
products = pd.read_csv("products.csv")
result = products.query('unit_price < 1000')[["product_name", "unit_price"]]
result.head()
语法重点: .query() 只负责行过滤,选列需在后面加 [["列1", "列2"]]。
【例 2-28】查询年龄在 25~35 岁之间的用户(含边界)
result = users.query('age >= 25 and age <= 35')
result.head()
语法重点: and, or, not 在 query() 中可替代 &, |, ~,更易读。
【例 2-29】从 orders.csv 中筛选出“支付宝”支付 且 状态为“完成”的订单
orders = pd.read_csv("orders.csv")
result = orders.query('payment_method == "支付宝" and order_status == "完成"')
result.head()
语法重点: 多条件使用 and 连接,逻辑关系更清晰。
【例 2-30】使用动态变量筛选:查询价格低于变量设定值的商品
max_price = 800
result = products.query('unit_price < @max_price')
result.head()
语法重点: 使用 @变量名 引用 Python 变量,让查询更动态、可重用。
【例 2-31】带空格的列名查询:筛选评分值为5,用户ID为U000001的商品评分记录
(假设列名为 user id,使用反引号)
ratings = pd.read_csv("product_ratings.csv")
print(ratings.columns)
ratings.columns = ["rating_id", "order_id", "user id", "product_id", "rating", "rating_time"]
result = ratings.query('rating == 5 and `user id` == "U000001"')
result
语法重点: 对-于列名含空格或特殊符号,必须使用反引号 列名 包裹。
【例 2-32】结合浏览日志,筛选出行为为“加购”的前 5 条记录
logs = pd.read_csv("browsing_logs.csv")
result = logs.query('action_type == "加购"')
result.head()
语法重点: query 支持任意布尔表达式字符串,逻辑语义清晰。
【练习题】
【练习 2-14】从用户表中筛选出所有性别为“女”的用户信息
users = pd.read_csv("users.csv")
result = users.query('gender == "女"')
result.head()
👉 语法重点:单条件筛选,字符串要用双引号。
【练习 2-15】从商品表中筛选价格在 2000 到 4000 元之间的商品,并查看商品名和品牌
products = pd.read_csv("products.csv")
result = products.query('2000 <= unit_price <= 4000')[["product_name", "brand"]]
result.head()
👉 语法重点:区间条件可以写成 a <= x <= b。
【练习 2-16】查询订单表中,配送方式为“快递”且订单状态为“完成”的订单,显示用户编号和下单时间
orders = pd.read_csv("orders.csv")
result = orders.query('delivery_type == "快递" and order_status == "完成"')[["user_id", "order_date"]]
result.head()
👉 语法重点:多条件用 and,并可结合列选择。
【练习 2-17】从用户表中查询所有在“北京”或“上海”注册的用户
result = users.query('city == "北京" or city == "上海"')[["user_name", "city"]]
result.head()
👉 语法重点:逻辑或用 or。
【练习 2-18】从订单明细表中筛选折扣小于 1 且购买数量大于等于 3 的记录
items = pd.read_csv("order_items.csv")
result = items.query('discount < 1 and quantity >= 3')
result.head()
👉 语法重点:跨字段条件组合。
2.7 综合练习
【练习 2-19】从用户表中筛选所有 注册城市为“广州” 的用户,显示 user_name, city 数据表:users.csv
import pandas as pd
users = pd.read_csv("users.csv")
# 方法A:[]
res1 = users[users["city"]=="广州"][["user_name","city"]]
# 方法B:.loc
res2 = users.loc[users["city"]=="广州", ["user_name","city"]]
# 方法C:.query
res3 = users.query('city == "广州"')[["user_name","city"]]
【练习 2-20】从商品表中筛选 价格低于 1000 元 的商品,显示 product_name, unit_price 数据表:products.csv
products = pd.read_csv("products.csv")
# 方法A:[]
res1 = products[products["unit_price"]<1000][["product_name","unit_price"]]
# 方法B:.loc
res2 = products.loc[products["unit_price"]<1000, ["product_name","unit_price"]]
# 方法C:.query
res3 = products.query('unit_price < 1000')[["product_name","unit_price"]]
【练习 2-21】筛选 年龄≥30 且性别为女 的用户,显示 user_name, age, province 数据表:users.csv
# 方法A:[]
res1 = users[(users["age"]>=30) & (users["gender"]=="女")][["user_name","age","province"]]
# 方法B:.loc
res2 = users.loc[(users["age"]>=30) & (users["gender"]=="女"), ["user_name","age","province"]]
# 方法C:.query
res3 = users.query('age >= 30 and gender == "女"')[["user_name","age","province"]]
【练习 2-22】从订单表中筛选 支付方式为“支付宝” 且 状态为“完成” 的订单,显示 order_id, user_id, order_date 数据表:orders.csv
orders = pd.read_csv("orders.csv")
# 方法A:[]
res1 = orders[(orders["payment_method"]=="支付宝") & (orders["order_status"]=="完成")][["order_id","user_id","order_date"]]
# 方法B:.loc
res2 = orders.loc[(orders["payment_method"]=="支付宝") & (orders["order_status"]=="完成"), ["order_id","user_id","order_date"]]
# 方法C:.query
res3 = orders.query('payment_method == "支付宝" and order_status == "完成"')[["order_id","user_id","order_date"]]
【练习 2-23】筛选浏览日志中 2024年1月 且 行为为“加购”或“收藏” 的记录,显示 user_id, product_id, action_type, browse_time 数据表:browsing_logs.csv
logs = pd.read_csv("browsing_logs.csv")
# 方法A:[]
res1 = logs[(logs["browse_time"].astype(str).str.startswith("2024-01")) &
(logs["action_type"].isin(["加购","收藏"]))][["user_id","product_id","action_type","browse_time"]]
res1.head()
# 方法B:.loc
res2 = logs.loc[(logs["browse_time"].astype(str).str.startswith("2024-01")) &
(logs["action_type"].isin(["加购","收藏"])), ["user_id","product_id","action_type","browse_time"]]
res1.head()
# 方法C:.query
res3 = logs.query('browse_time >= "2024-01-01" and browse_time < "2024-02-01" and action_type in ["加购","收藏"]')[["user_id","product_id","action_type","browse_time"]]
res1.head()