数据分析:排序

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

相关推荐
hhzz3 小时前
基于监控视频的水位尺自动识别技术方案与实现
python·opencv·yolo·图像识别·cv
yongche_shi3 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
weixin_408099674 小时前
OCR批量识别图片方案:从手动处理到自动化API系统(Python/Java/PHP实战)
图像处理·python·ocr·文字识别·api调用·批量识别·石榴智能
AI行业学习5 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
大圣编程6 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
云烟成雨TD6 小时前
LangFlow 1.x 系列【5】可视化编辑页面功能说明
人工智能·python·agent
geovindu7 小时前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
tryCbest8 小时前
Python 文件操作
服务器·python
风流 少年8 小时前
数据分析:numpy
数据挖掘·数据分析·numpy
涛声依旧-底层原理研究所8 小时前
Agent 长任务可靠性设计:实现暂停、恢复、续跑与崩溃重启的完整方案
人工智能·python·系统架构