数据分析:排序

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

相关推荐
天雪浪子2 小时前
Python入门教程之赋值运算符
开发语言·python
站大爷IP2 小时前
5个技巧写出专业Python代码:从新手到进阶的实用指南
python
hrrrrb3 小时前
【Python】字符串
java·前端·python
大翻哥哥3 小时前
Python 2025:低代码开发与自动化运维的新纪元
运维·python·低代码
Source.Liu3 小时前
【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
windows·python·自动化
Source.Liu3 小时前
【Pywinauto库】12.1 pywinauto.backend 后端内部实施模块
开发语言·windows·python·自动化
用户8356290780513 小时前
用Python高效处理Excel数据:Excel数据读取指南
后端·python
我星期八休息4 小时前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
蒋星熠4 小时前
如何在Anaconda中配置你的CUDA & Pytorch & cuNN环境(2025最新教程)
开发语言·人工智能·pytorch·python·深度学习·机器学习·ai