李翔-大数据技术

Big data technology!

第2章 数据检查

第2章 数据检查

2.1 项目背景

随着互联网和移动支付的普及,电子商务行业飞速发展,用户数量、商品规模和订单数据不断增长。在这种背景下,电商平台积累了海量的用户行为与交易数据,为深入开展用户画像、精准营销、商品推荐、销售预测等提供了强有力的数据基础。

作为一名初级数据分析师,你刚加入了一家大型电商公司,接到的第一个任务是:对平台近几年的运营数据进行初步分析,发现有价值的商业信息,并以图表方式进行展示,支持运营决策。

公司为你提供了一组模拟数据,包括:

  • 用户注册信息(users 表)

  • 商品库(products 表)

  • 订单信息与订单明细(ordersorder_items 表)

  • 用户行为日志(browsing_logs 表)

  • 商品评分记录(product_ratings 表)

你需要对这批数据进行读取、清洗、分析与可视化,完成以下问题探索:


分析任务:

  1. 平台用户的性别与年龄分布特征如何?是否存在特定城市或省份的用户占比较高?

  2. 平台哪些商品销量最好?不同类别的畅销品牌有哪些?

  3. 用户行为(浏览、加购、收藏)是否对订单转化有促进作用?

  4. 评分较高的商品是否也有较高的销量?是否存在热门但评分低的商品?

  5. 能否以清晰直观的图表方式向领导汇报这些洞察结果?


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(一维带标签数据结构)

image-20240731103535993

Pandas DataFrame 结构图解释

  1. 总体结构

    • DataFrame 是一个二维表格型数据结构,类似 Excel 表或 SQL 表格;

    • 每一列可包含不同类型的数据,如数字、文本、布尔值等。

  2. 轴标签(Axis Labels)

    • 行索引(Index)

      图中左侧的蓝色条形区域,用于标识每一行,默认从 0 开始,可自定义为日期、编号等。

    • 列名(Columns)

      图中顶部的橙色区域,用于标识每一列,在数据操作中用于定位或引用列。

  3. 数据区域

    • 位置:位于中间的网格区域【图中的浅灰色网格区域】,存储具体的数据。

    • 作用:每个值可通过“行索引 + 列名”访问。

  4. 单列结构:Series

    • Series

      从 DataFrame 中选取某一列,会返回一个 Series一维带索引的结构);

      Series 类似数组,保留行索引,可单独分析处理列数据。

  5. 轴方向(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)


未标题-1

DataFrame 和 Series 总结对比


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


举例

image-20240731102851083


2.3 数据获取

【数据下载:】https://wwtf.lanzoul.com/ijbQ535g2jri

本教程涉及的数据及其结构的描述:

数据表简介


表名数据量用途说明
users10,000 条模拟电商平台注册用户,支持用户画像、活跃度分析、分群建模等任务
products1,000 条商品库,含多类目、品牌、价格区间,支持分类推荐、销量排行等分析
orders500,000 条订单主表,每个用户 7~15 单,时间覆盖 2020–2024 年,支持销售趋势分析
order_items1,500,000 条每单含 1~5 个商品,构成明细表,支持订单金额聚合、商品偏好分析等任务
browsing_logs2,000,000 条用户行为日志(浏览、加购、收藏),支持转化路径分析与推荐系统建模
product_ratings500,000 条商品评分数据,购买用户评价,支持协同过滤、热度分析等挖掘任务



表1:users (用户信息表)


字段名类型含义说明示例
user_idSTRING用户唯一编号(U+编号)U0001
user_nameSTRING用户姓名(中文,随机生成)王小明
genderSTRING性别(男 / 女)
ageINT年龄(18 ~ 60岁)28
register_dateDATE注册时间(2020~2024之间)2021-06-01
citySTRING注册城市(中国主要城市)广州
provinceSTRING所在省份(对应城市的上级)广东



表2:products(商品信息表)


字段名类型含义说明示例
product_idSTRING商品唯一编号(P+编号)P0001
product_nameSTRING商品名称(品牌+名称模板)小米手机
categorySTRING商品所属类别(6大类)手机数码类
unit_priceFLOAT商品当前单价(单位:元)1999.00
brandSTRING品牌名称小米



表3:orders(订单信息表)


字段名类型含义说明示例
order_idSTRING订单编号,唯一标识每笔交易O202406010001
user_idSTRING下单用户的唯一编号(关联 users 表)U0000001
order_dateDATE下单时间,不能早于注册时间2023-11-21
payment_methodSTRING支付方式,如"微信", "支付宝", "信用卡", "货到付款", "花呗"等微信支付
order_statusSTRING订单状态,如“完成”或“取消”完成
delivery_citySTRING收货城市杭州
delivery_typeSTRING配送方式,如快递、自提、上门服务等快递



表4:order_items(订单明细表)


字段名类型含义说明示例
item_idSTRING明细编号(唯一,格式 OI+6位编号)OI000001
order_idSTRING所属订单编号,外键关联 ordersO202406010001
product_idSTRING商品编号,外键关联 productsP0001
quantityINT购买数量(每种商品 1~5件)2
discountFLOAT商品折扣(浮点数,0.8~1.0)0.90



表5:browsing_logs(用户行为日志)


字段名类型含义说明示例
log_idSTRING日志编号,唯一标识一条行为记录LOG0000001
user_idSTRING用户编号,外键关联 usersU0000001
product_idSTRING商品编号,外键关联 productsP0001
browse_timeTIMESTAMP用户行为发生的时间戳(含时分秒)2024-01-01 10:22:33
action_typeSTRING行为类型,如“浏览”、“收藏”、“加购”、”下单“、”成交“浏览



表6:product_ratings(商品评分表)


字段名类型含义说明示例
rating_idSTRING主键,全局唯一评分记录编号r0000001
order_idSTRING所属订单编号,外键关联 ordersO202406010012
user_idSTRING用户编号,外键关联 usersU000001
product_idSTRING商品编号,外键关联 productsP0001
ratingINT用户评分值(1~5 星)4
rating_timeTIMESTAMP评分时间(下单后0~15天内,精确到秒)2024-03-02 15:34:11



2.4 数据读入

前期准备:

1.创建实验目录 在每个班级的工作目录下(如 D:/bigdata1/),新建子目录 DataAnalysis

2.放置数据文件 将实验所需的数据集文件复制到 DataAnalysis 目录中。

3.进入实验目录 打开命令行Anaconda Prompt,切换到目录:

D:/bigdata1/DataAnalysis

4.启动 Jupyter Notebook 在该目录下启动 Jupyter Notebook,准备开始实验。

5.创建或打开代码文件


【知识点】

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=0index_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_nameunit_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)]

语法重点:

  • 多条件筛选用 &(与)、|(或);

  • 每个条件外都要加括号 ( )

  • 字符串比较用 ==,数值比较用 <, >, >= 等。

image-20250727105105940


【例 2-16】从评分表中选出评分为 5 分的记录,并查看对应的 user_idproduct_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_idaction_type

logs = pd.read_csv("browsing_logs.csv")
print(logs[:10][["user_id", "action_type"]])

语法重点: 行切片后可以再进行列选择,用于快速预览重点字段。


【练习题】

练习 2-1:选取用户表中部分列

users.csv 中选择 user_idage 两列,查看前 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_idproduct_id 两列。

items = pd.read_csv("order_items.csv")

# 数量大于等于 3
items[items["quantity"] >= 3][["order_id", "product_id"]]

练习 2-4:用户行为日志取样

browsing_logs.csv 中取最后 5 行,显示其中的 user_idproduct_idaction_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 中,找出所有评分为 12 的差评,查看 user_idproduct_idrating_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方式

【知识点】

  1. 基本概念对比


方法索引方式使用规则适用场景
.loc标签索引用行/列的“名字”进行选择根据列名或行名选取
.iloc位置索引用行/列的“数字位置”进行选择按顺序、位置精确选取


img

image-20241014151559488

lociloc 是 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 列


lociloc的区别

image-20241014151608923


lociloc总结


对比点.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 开始)作为行标签。在这种情况下,行标签和整数位置是相同的,因此可以使用 lociloc 进行索引,两者的效果相同。


loc方式(基于标签)


【例 2-18】从用户信息表 users.csv 中选出前5行的 user_namecity 列。

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_idpayment_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_idcity

users = pd.read_csv("users.csv")
result = users.loc[users["province"] == "广东", ["user_id", "city"]]
result.head()

语法要点: loc[条件, 列] 可以直接指定需要输出的字段。


【练习 2-7】从订单表中筛选 2023 年以后的订单,显示 order_idorder_datedelivery_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_idproduct_idrating

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_idquantity 列(假设这两列是第 2、3 列)。

items.iloc[20:26, [2, 3]]

语法要点: iloc 必须用整数位置,不能写列名。



2.6.3 采用表达式方式

【知识点】

df.query() 是 Pandas 提供的一种用于快速对 DataFrame 进行查询和过滤的简便方法。

# 语法
df.query('条件表达式')
# 举例:
df.query('Country == "China"')

条件表达式:可以是一个完整的布尔表达式字符串,用于定义查询条件。例如 Country == "China"

注意

  • 简洁性:使用字符串表达式进行查询,语法简单,代码更具可读性。

  • 直接使用列名:在表达式中直接使用列名,不需要加引号或使用方括号。

  • 逻辑运算符:支持使用 andornot 等逻辑运算符,或者使用 &|~

  • 字符串处理:字符串值需要用双引号(")括起来。

  • 带空格的列名:对于带有空格或特殊字符的列名,使用反引号(``)括起来。

  • 动态变量:可以通过 @` 符号在表达式中引用 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, notquery() 中可替代 &, |, ~,更易读。


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


发表评论:

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

Powered By Z-BlogPHP 1.7.3

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