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

该题目来自力扣

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])
相关推荐
godspeed_lucip几秒前
LLM和Agent——专题3: Agentic Workflow 入门(2)
网络·人工智能·python
mingshili2 分钟前
[Python] Python中自带模块级的单例模式-不需要定义单例类
python·单例模式
alphaTao23 分钟前
LeetCode 每日一题 2026/5/18-2026/5/24
python·leetcode
徐安安_ye124 分钟前
FlashAttention学习路线:从调API到写算子,你该走哪条路
python·学习
IT策士42 分钟前
Django 从 0 到 1 打造完整电商平台:商品搜索
后端·python·django
茉莉玫瑰花茶1 小时前
LangGraph 持久化(Persistence)[ 2 ]
开发语言·python·ai·langgraph
有味道的男人1 小时前
AI 对接 1688 图搜接口|Open Claw 以图搜货实战
开发语言·python
MediaTea1 小时前
DL:Transformer 的基本原理与 PyTorch 实现
人工智能·pytorch·python·深度学习·transformer
wuxinyan1231 小时前
工业级大模型学习之路024:LangChain零基础入门教程(第七篇):RAG 系统评估、全链路调优
人工智能·python·学习·langchain
Kingairy1 小时前
Python简单算法题
开发语言·python