#该题目来源于力扣:
1241. 每个帖子的评论数 - 力扣(LeetCode)
题目要求:
表 Submissions :+---------------+----------+
| 列名 | 类型 |
+---------------+----------+
| sub_id | int |
| parent_id | int |
+---------------+----------+
上表可能会出现重复的行。
每行可以是一个帖子或对该帖子的评论。
如果这是一篇帖子,则 parent_id 为 null。
如果这是一条评论,则 parent_id 对应帖子的 sub_id。编写一个解决方案以查找每个帖子的评论数。结果表应包含帖子的 post_id 和对应的评论数 number_of_comments 。Submissions 可能包含重复的评论。你应该统计出每个帖子的 唯一评论 的数目。Submissions 可能包含重复的帖子。你应该将它们视为一个帖子。返回结果表应该按 post_id 升序排序。结果格式如下例所示。示例 1:输入:
Submissions table:
+---------+------------+
| sub_id | parent_id |
+---------+------------+
| 1 | Null |
| 2 | Null |
| 1 | Null |
| 12 | Null |
| 3 | 1 |
| 5 | 2 |
| 3 | 1 |
| 4 | 1 |
| 9 | 1 |
| 10 | 2 |
| 6 | 7 |
+---------+------------+
输出:
+---------+--------------------+
| post_id | number_of_comments |
+---------+--------------------+
| 1 | 3 |
| 2 | 2 |
| 12 | 0 |
+---------+--------------------+
解释:
表中 ID 为 1 的帖子有 ID 为 3、4 和 9 的三个评论。表中 ID 为 3 的评论重复出现了,所以我们只对它进行了一次计数。
表中 ID 为 2 的帖子有 ID 为 5 和 10 的两个评论。
表中 ID 为 12 的帖子没有评论。
表中 ID 为 6 的评论是对 ID 为 7 的已删除帖子的评论,因此我们将其忽略。
题目解释:
意思就是说,在针对全表进行去重之后,如果sub_id(帖子或评论的id列)对应的parent_id(评论的帖子id)为null,说明sub_id在列中是表示帖子的,如果sub_id对应的parent_id不为null,说明这里的sub_id是评论,而这里的parent_id就是评论的帖子id,对应的是parent_id为null的sub_id。现在要求统计每个帖子(非null的parent_id)被(对应parent_id为null的post_id)评论了多少次?
思路流程:
首先先取出parent_id为null的数据,这样就可以得到所有的sub_id是帖子的值,储存到变量submissions_1中。然后将submissions_1和原数据集进行左连接,保留所有submissions_1的值,按照submissions_1的sub_id和submissions的parent_id进行连接,这样被连接的submissions表的parent_id就自动去除了所有的非帖子值,实现了数据的初步清洗。清洗后,对连接的数据集进行去重后的分组聚合即可统计出所有作为贴子的parent_id的唯一评论数量sub_id有多少
代码实现:
import pandas as pddef count_comments(submissions: pd.DataFrame) -> pd.DataFrame:submissions_1=submissions.query('parent_id.isnull()')data=submissions_1.merge(submissions,how='left',left_on='sub_id',right_on='parent_id')data=data.drop_duplicates().groupby('sub_id_x').agg({'sub_id_y':'count'}).reset_index().rename(columns={'sub_id_x':'post_id','sub_id_y':'number_of_comments'})return data