数据分析:排序

📌 题目一: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])

🔍 解析

  1. sort_values(by='monetary', ascending=False)
    • 按照 monetary 字段进行降序排序(金额从高到低)。
  2. .head(3) 或 [:3]
    • 取前3条记录。
  3. .reset_index(drop=True)
    • 重置行索引为 0, 1, 2...,便于规范输出;drop=True 表示丢弃原索引。

✅ 输出格式与示例一致,符合"索引从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:用户ID
  • Name:用户名
  • 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)

🔍 解析

  1. sort_values(by='Level', inplace=True)
    • 对 Level 字段升序排序(默认 ascending=True),并直接在原 DataFrame 上修改。
  2. pd.set_option(...)
    • display.width: 设置控制台显示宽度
    • max_rows, max_columns: 允许显示所有行和列,避免省略(...)或折叠
  3. 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)

✅ 学习建议

  1. 理解 inplace 参数的影响:是否希望保留原始数据?
  2. 注意输出格式要求:是否需要重置索引?是否要显示全部内容?
  3. 善用 pd.set_option:调试时防止信息被隐藏。
  4. 练习多字段排序:实际业务中更常见。

🎯 进阶思考 :

如果多个用户的 monetary 相同,如何进一步按 frequency 排序?

👉 答案:df.sort_values(by=['monetary', 'frequency'], ascending=[False, False])

相关推荐
小小张说故事9 小时前
Python 的 a[1:5:2] 到底切出了什么?拆开 slice 对象、__getitem__ 与负步长那次反向
python
wuyk5559 小时前
PyQt6-第15讲-数据可视化QChart
python·ui·信息可视化·pyqt
天天被压力9 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
日日大王学编程9 小时前
2026主流AI Agent产品分类、核心差异与技术特性全解析
人工智能·后端·python
天天被压力9 小时前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
武天旭1 天前
AI安全--AI大模型的毒性偏见与安全对齐实践
人工智能·python·深度学习
GrowingIO技术社区1 天前
CDP项目如何评估?从业务问题到能力测试
大数据·数据分析
衡石科技1 天前
衡石高性能分析架构:HQL、查询下推与多层加速的协同设计
架构·数据分析
视觉小萌新1 天前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
GrowingIO技术社区1 天前
多端用户身份怎么统一?OneID规则与验收清单
大数据·数据挖掘·数据分析