- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
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的运用
- 计算回答率最高的值~