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

该题目来自力扣

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])
相关推荐
databook6 小时前
像搭积木一样思考:数据科学中的“自下而上”之道
python·数据挖掘·数据分析
luoluoal6 小时前
基于python的医疗问句中的实体识别算法的研究(源码+文档)
python·mysql·django·毕业设计·源码
啊阿狸不会拉杆6 小时前
《机器学习导论》第 9 章-决策树
人工智能·python·算法·决策树·机器学习·数据挖掘·剪枝
喵手6 小时前
Python爬虫实战:城市停车收费标准自动化采集系统 - 让停车费透明化的技术实践(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·城市停车收费标准·采集城市停车收费数据·采集停车数据csv文件导出
无水先生6 小时前
python函数的参数管理(01)*args和**kwargs
开发语言·python
py小王子6 小时前
dy评论数据爬取实战:基于DrissionPage的自动化采集方案
大数据·开发语言·python·毕业设计
Pyeako6 小时前
opencv计算机视觉--LBPH&EigenFace&FisherFace人脸识别
人工智能·python·opencv·计算机视觉·lbph·eigenface·fisherface
小陶的学习笔记6 小时前
python~基础
开发语言·python·学习
多恩Stone6 小时前
【3D AICG 系列-9】Trellis2 推理流程图超详细介绍
人工智能·python·算法·3d·aigc·流程图
ID_180079054736 小时前
Python结合淘宝关键词API进行商品价格监控与预警
服务器·数据库·python