[每日一练]各赛事的用户注册率

该题目来自力扣

1633. 各赛事的用户注册率 - 力扣(LeetCode)

题目要求:

用户表: Users

复制代码
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| user_name   | varchar |
+-------------+---------+
user_id 是该表的主键(具有唯一值的列)。
该表中的每行包括用户 ID 和用户名。

注册表: Register

复制代码
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| contest_id  | int     |
| user_id     | int     |
+-------------+---------+
(contest_id, user_id) 是该表的主键(具有唯一值的列的组合)。
该表中的每行包含用户的 ID 和他们注册的赛事。

编写解决方案统计出各赛事的用户注册百分率,保留两位小数。

返回的结果表按 percentage降序 排序,若相同则按 contest_id升序排序。

返回结果如下示例所示。

示例 1:

复制代码
输入:
Users 表:
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 6       | Alice     |
| 2       | Bob       |
| 7       | Alex      |
+---------+-----------+

Register 表:
+------------+---------+
| contest_id | user_id |
+------------+---------+
| 215        | 6       |
| 209        | 2       |
| 208        | 2       |
| 210        | 6       |
| 208        | 6       |
| 209        | 7       |
| 209        | 6       |
| 215        | 7       |
| 208        | 7       |
| 210        | 2       |
| 207        | 2       |
| 210        | 7       |
+------------+---------+
输出:
+------------+------------+
| contest_id | percentage |
+------------+------------+
| 208        | 100.0      |
| 209        | 100.0      |
| 210        | 100.0      |
| 215        | 66.67      |
| 207        | 33.33      |
+------------+------------+
解释:
所有用户都注册了 208、209 和 210 赛事,因此这些赛事的注册率为 100% ,我们按 contest_id 的降序排序加入结果表中。
Alice 和 Alex 注册了 215 赛事,注册率为 ((2/3) * 100) = 66.67%
Bob 注册了 207 赛事,注册率为 ((1/3) * 100) = 33.33%

思路解释:

首先我们并不用将两个表结合,只需要对Register表按照contest_id进行分组即可,之后将分组后的user_id列除以Users表的总人数再*100即可。

代码实现:

python 复制代码
import pandas as pd

def users_percentage(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame:
    data=register.groupby('contest_id')['user_id'].count().reset_index()
    data['percentage']=(data['user_id']*100/users['user_id'].count()).round(2)
    return data[['contest_id','percentage']].sort_values(['percentage','contest_id'],ascending=[False,True])

代码简化思考:

有了以上的推理过程,如何简化代码,使它看起来更简洁呢?

我们可以利用agg聚合函数和lambda遍历函数组合来实现:

python 复制代码
import pandas as pd

def users_percentage(users: pd.DataFrame, register: pd.DataFrame) -> pd.DataFrame:
    data=register.groupby('contest_id').agg({'user_id':lambda x:(x.count()*100/users['user_id'].count()).round(2)}).reset_index().rename(columns={'user_id':'percentage'})
    return data.sort_values(['percentage','contest_id'],ascending=[False,True])
相关推荐
小智RE0-走在路上19 分钟前
Python学习笔记(8) --函数的多返回值,不同传参,匿名函数
笔记·python·学习
ZHSH.33 分钟前
2026蓝桥杯备赛 | 赛事介绍及python基础(未完)
python·蓝桥杯·数据结构与算法
长安牧笛33 分钟前
设计残疾人出行路线规划工具,输入起点终点,自动筛选无障碍通道,电梯,盲道路线,避开台阶和陡坡。
python
程序员佳佳2 小时前
2025年大模型终极横评:GPT-5.2、Banana Pro与DeepSeek V3.2实战硬核比拼(附统一接入方案)
服务器·数据库·人工智能·python·gpt·api
刘某的Cloud2 小时前
列表、元组、字典、集合-组合数据类型
linux·开发语言·python
ys~~3 小时前
git学习
git·vscode·python·深度学习·学习·nlp·github
Mqh1807623 小时前
day46 Grad-CAM
python
郝学胜-神的一滴3 小时前
Python魔法函数一览:解锁面向对象编程的奥秘
开发语言·python·程序人生
一位代码3 小时前
pandas | 查看数据特征的常见属性及方法
pandas
白露与泡影3 小时前
使用systemd,把服务装进 Linux 心脏里~
linux·运维·python