#该题目来源于力扣:
题目要求:
表:Sessions
+---------------------+---------+
| Column Name | Type |
+---------------------+---------+
| session_id | int |
| duration | int |
+---------------------+---------+
session_id 是该表主键
duration 是用户访问应用的时间, 以秒为单位
你想知道用户在你的 app 上的访问时长情况。因此你决定统计访问时长区间分别为 "[0-5>","[5-10>","[10-15>" 和 "15 minutes or more" 的会话数量,并以此绘制柱状图。
写一个解决方案来报告 (bin, total) 。
返回结果 无顺序要求 。
结果格式如下所示。
示例 1:
输入:
Sessions 表:
+-------------+---------------+
| session_id | duration |
+-------------+---------------+
| 1 | 30 |
| 2 | 199 |
| 3 | 299 |
| 4 | 580 |
| 5 | 1000 |
+-------------+---------------+
输出:
+--------------+--------------+
| bin | total |
+--------------+--------------+
| [0-5> | 3 |
| [5-10> | 1 |
| [10-15> | 0 |
| 15 or more | 1 |
+--------------+--------------+
解释:
对于 session_id 1,2 和 3 ,它们的访问时间大于等于 0 分钟且小于 5 分钟。
对于 session_id 4,它的访问时间大于等于 5 分钟且小于 10 分钟。
没有会话的访问时间大于等于 10 分钟且小于 15 分钟。
对于 session_id 5, 它的访问时间大于等于 15 分钟。
思路流程:
- 创建具有所有条件的列
定义函数进行条件判断,这样就可以将这些复杂的判断一起传递给lambda遍历函数了
将自定义判断函数遍历传递给新建列bin_s
将两个表按照bin表(圈条件表)进行连接,然后按照bin表的bin列进行分组聚合即可
代码实现:
import pandas as pd
def create_bar_chart(sessions: pd.DataFrame) -> pd.DataFrame:
#创建具有所有条件的列
bin=pd.DataFrame({'bin_l':['[0-5>','[5-10>','[10-15>','15 or more']})
#定义函数进行条件判断,这样就可以将这些复杂的判断一起传递给lambda遍历函数了
def funcion(x):
if x<300:
return '[0-5>'
elif x<600 and x>=300:
return '[5-10>'
elif x<900 and x>=600:
return '[10-15>'
else:
return '15 or more'
#将自定义判断函数遍历传递给新建列bin
sessions['bin_s']=sessions['duration'].apply(lambda x:funcion(x))
#将两个表按照bin表(圈条件表)进行连接,然后按照bin表的bin列进行分组聚合即可
data=sessions.merge(bin,left_on='bin_s',right_on='bin_l',how='right')
data=data.groupby('bin_l')['session_id'].count().reset_index().rename(columns={'bin_l': 'bin', 'session_id': 'total'})
return data