数据分析:排序

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

相关推荐
珺毅同学1 小时前
YOLO输出COCO指标及YOLOv12报错
python·深度学习·yolo
2401_841495643 小时前
Windows 系统中ffmpeg安装问题的彻底解决
windows·python·ffmpeg·bug·语音识别·下载·安装步骤
waysolong903 小时前
MCP服务构建、使用
python
胜天半月子3 小时前
Python自动化测试 | 快速认识并了解pytest的基本使用
服务器·python·pytest
小小测试开发4 小时前
Python Web3库入门:从零开始与以太坊区块链交互
python·web3·区块链
独行soc4 小时前
2025年渗透测试面试题总结-224(题目+回答)
网络·python·安全·web安全·adb·渗透测试·安全狮
程序员三藏4 小时前
软件测试之环境搭建及测试流程
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
10岁的博客4 小时前
PyTorch快速搭建CV模型实战
人工智能·pytorch·python
寒秋丶4 小时前
AutoGen多智能体协作、人机交互与终止条件
人工智能·python·microsoft·ai·人机交互·ai编程·ai写作
Turnsole_y4 小时前
pytest与Selenium结合使用指南
开发语言·python