数据分析:排序
📌 题目一:DA44 某店铺消费最多的前三名用户
✅ 题目描述
现有某店铺会员消费情况 sales.csv
,包含以下字段:
user_id
:会员编号recency
:最近一次消费距离当天的天数frequency
:一段时间内消费的次数monetary
:一段时间内消费的总金额
任务:统计消费金额(monetary
)最多的前3名用户。
📥 输入描述
从当前目录读取 sales.csv
文件。
📤 输出描述
输出消费金额最高的前3名用户信息,索引从0开始重新编号(即重置索引)。
💻 代码实现
import pandas as pd# 读取数据
df = pd.read_csv('sales.csv')# 按 monetary 降序排序,取前3行,并重置索引
result = df.sort_values(by='monetary', ascending=False).reset_index(drop=True).head(3)# 打印结果
print(result)
等价写法:
print(df.sort_values(by='monetary', ascending=False).reset_index(drop=True)[:3])
🔍 解析
sort_values(by='monetary', ascending=False)
- 按照
monetary
字段进行降序排序(金额从高到低)。
- 按照
.head(3)
或[:3]
- 取前3条记录。
.reset_index(drop=True)
- 重置行索引为 0, 1, 2...,便于规范输出;
drop=True
表示丢弃原索引。
- 重置行索引为 0, 1, 2...,便于规范输出;
✅ 输出格式与示例一致,符合“索引从0开始”的要求。
🧠 扩展知识点
方法 | 说明 |
---|---|
sort_values() | 支持单列或多列排序,如 by=['A', 'B'] |
ascending=False | 控制升序/降序 |
reset_index() | 重置索引,常用于排序后规范化 |
drop=True | 避免旧索引变成新列 |
📌 常见错误提醒:
- 忘记
reset_index()
→ 索引仍是原始位置,不符合题意。 - 使用
inplace=True
而不打印 →print(df.sort_values(...))
不会生效。
📌 题目二:DA45 按等级递增查看牛客网用户信息
✅ 题目描述
给定 Nowcoder.csv
文件,字段如下:
Nowcoder_ID
:用户IDName
:用户名Level
:等级(1~7)Achievement_value
:成就值Num_of_exercise
:刷题量Graduate_year
:毕业年份Language
:常用语言
任务:按等级(Level)升序排列,并输出全部数据(含行号)。
📥 输入描述
从当前目录读取 Nowcoder.csv
。
📤 输出描述
输出按 Level
升序排列的完整数据表,包括行号(即默认索引)。
💻 代码实现
import pandas as pd# 设置显示选项,防止输出被截断
pd.set_option('display.width', 300)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)# 读取数据
df = pd.read_csv('Nowcoder.csv')# 按 Level 升序排序(inplace=True 直接修改原 DataFrame)
df.sort_values(by='Level', inplace=True)# 打印结果(自动带行号)
print(df)
🔍 解析
sort_values(by='Level', inplace=True)
- 对
Level
字段升序排序(默认ascending=True
),并直接在原 DataFrame 上修改。
- 对
pd.set_option(...)
display.width
: 设置控制台显示宽度max_rows
,max_columns
: 允许显示所有行和列,避免省略(...)或折叠
print(df)
自动带行号- Pandas DataFrame 默认显示行索引(即行号),满足“包括行号”要求。
🧠 扩展知识点
技巧 | 说明 |
---|---|
inplace=True | 原地修改,节省内存;但会丢失原始顺序 |
显示设置 | 在处理大数据或宽表时非常关键 |
多字段排序 | 如 by=['Level', 'Achievement_value'] 可实现次要排序 |
📌 替代写法(不修改原数据):
result = df.sort_values(by='Level').reset_index(drop=True)
print(result)
📘 总结对比
项目 | DA44 | DA45 |
---|---|---|
排序字段 | monetary | Level |
排序方式 | 降序 (ascending=False ) | 升序(默认) |
是否重置索引 | 是(要求索引从0开始) | 否(但用了 inplace 修改原数据) |
输出数量 | 前3条 | 全部数据 |
显示控制 | 无特殊要求 | 使用 pd.set_option 防止截断 |
关键函数 | sort_values , head , reset_index | sort_values , pd.set_option |
🛠️ 实用 Pandas 排序技巧总结
# 1. 单字段降序
df.sort_values(by='monetary', ascending=False)# 2. 多字段排序:先按 Level 升序,再按成就值降序
df.sort_values(by=['Level', 'Achievement_value'], ascending=[True, False])# 3. 保留前 N 条
df.nlargest(3, 'monetary') # 等价于 sort + head
df.nsmallest(5, 'recency')# 4. 重置索引(常用)
df.reset_index(drop=True, inplace=True)
✅ 学习建议
- 理解
inplace
参数的影响:是否希望保留原始数据? - 注意输出格式要求:是否需要重置索引?是否要显示全部内容?
- 善用
pd.set_option
:调试时防止信息被隐藏。 - 练习多字段排序:实际业务中更常见。
🎯 进阶思考:
如果多个用户的 monetary
相同,如何进一步按 frequency
排序?
👉 答案:df.sort_values(by=['monetary', 'frequency'], ascending=[False, False])