21,Python数分之Pandas训练,力扣,578. 查询回答率最高的问题

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

SurveyLog 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| action      | ENUM |
| question_id | int  |
| answer_id   | int  |
| q_num       | int  |
| timestamp   | int  |
+-------------+------+
这张表可能包含重复项。
action 是一个 ENUM(category) 数据,可以是 "show"、"answer" 或者 "skip" 。
这张表的每一行表示:ID = id 的用户对 question_id 的问题在 timestamp 时间进行了 action 操作。
如果用户对应的操作是 "answer" ,answer_id 将会是对应答案的 id ,否则,值为 null 。
q_num 是该问题在当前会话中的数字顺序。

回答率 是指:同一问题编号中回答次数占显示次数的比率。

编写一个解决方案以报告 回答率 最高的问题。如果有多个问题具有相同的最大 回答率 ,返回 question_id 最小的那个。

查询结果如下例所示。

示例 1:

输入:
SurveyLog table:
+----+--------+-------------+-----------+-------+-----------+
| id | action | question_id | answer_id | q_num | timestamp |
+----+--------+-------------+-----------+-------+-----------+
| 5  | show   | 285         | null      | 1     | 123       |
| 5  | answer | 285         | 124124    | 1     | 124       |
| 5  | show   | 369         | null      | 2     | 125       |
| 5  | skip   | 369         | null      | 2     | 126       |
+----+--------+-------------+-----------+-------+-----------+
输出:
+------------+
| survey_log |
+------------+
| 285        |
+------------+
解释:
问题 285 显示 1 次、回答 1 次。回答率为 1.0 。
问题 369 显示 1 次、回答 0 次。回答率为 0.0 。
问题 285 回答率最高。

三,建表语句

import  pandas as pd

data = [[5, 'show', 285, None, 1, 123], [5, 'answer', 285, 124124, 1, 124], [5, 'show', 369, None, 2, 125], [5, 'skip', 369, None, 2, 126]]
survey_log = pd.DataFrame(data, columns=['id', 'action', 'question_id', 'answer_id', 'q_num', 'timestamp']).astype({'id':'Int64', 'action':'object', 'question_id':'Int64', 'answer_id':'Int64', 'q_num':'Int64', 'timestamp':'Int64'})

survey_log

四,分析

题解:

表:调查日志

表字段:日志id,问题状态,问题ID,问题答案,问题会话顺序,问题回答时间

求 回答率最高的问题,如果有多个 就取问题id最小的那个

问题回答率: 每个问题的回答次数/每个问题的显示次数

第一步,开两个新列   当action==show 和action ==answer的时候  分别给与1或者0代替

#开两个新列 转换show和anser 
survey_log['show'] = survey_log['action'].apply(lambda x: 1 if x =='show' else 0)
survey_log['answer'] = survey_log['action'].apply(lambda x: 1 if x =='answer' else 0)
survey_log

第二步:  以问题分组 求和show和answer列 并且计算回答率

第三步:取回答率最高的行

如果有的行也等于回答率最高的值  那么就保留下来  并且改名

第四步: 如果最大回答率有多列,那么以问题id排序,limit 取第一条

最后转为dataframe对象 输出即可

五,SQL解答

import pandas as pd

def get_the_question(survey_log: pd.DataFrame) -> pd.DataFrame:
    #开两个新列 转换show和anser 
    survey_log['show'] = survey_log['action'].apply(lambda x: 1 if x =='show' else 0)
    survey_log['answer'] = survey_log['action'].apply(lambda x: 1 if x =='answer' else 0)
    df = survey_log.groupby('question_id',as_index=False).agg({'show':'sum','answer':'sum'})
    df['h_d_l'] = df['answer']/df['show']
    df =   df[df['h_d_l'] ==df['h_d_l'].max()].rename(columns={'question_id':'survey_log'})
    res = df.sort_values('survey_log')['survey_log']
    res = res[:1]
    #转为dataframe对象
    res = res.to_frame()
    return res

六,验证

七,知识点总结

  • Pandas中 自定义函数的练习 API apply
  • python中 匿名函数的运用 lambda
  • python中三目运算符的运用   为真的值 if 条件 else 为假的时候的值
  • Pandas中分组聚合的运用
  • Pandas中类似实现子查询的效果的运用 条件 ==max的值
  • Pandas中对多列分组聚合的运用
  • Pandas中重置索引的运用   API reset_index()
  • Pandas中改名的运用 API rename
  • Pandas中实现类似sql中limit的运用  直接切片 【】
  • Pandas中排序的运用 API sort_vaules
  • Pandas中 series对象转为dataframe的运用
  • 计算回答率最高的值~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值