如何用Pythonic方式按论坛聚合帖子正负评分?
Pythonic方式按论坛聚合正负评分
假设你手里有这么一组论坛帖子的统计数据,需要按论坛维度把每个论坛的正负评分分别加总,转换成指定格式的JSON输出。先看看你的输入示例:
{ "Posting_Stats": { "Posts": [ { "Date": "2020-03-29 12:41:00", "Forum": "panorama", "Positive": 2, "Negative": 0 }, { "Date": "2020-03-29 12:37:00", "Forum": "web", "Positive": 6, "Negative": 0 }, { "Date": "2020-03-29 12:37:00", "Forum": "web", "Positive": 2, "Negative": 2 } ] } }
下面是几种Pythonic的实现方式,挑最顺手的用就行:
方法一:用collections.defaultdict(原生库,轻量高效)
这个方法用标准库的字典来聚合数据,逻辑清晰,不需要额外依赖:
import json from collections import defaultdict # 假设输入数据已经加载进来了 input_data = { "Posting_Stats": { "Posts": [ {"Date": "2020-03-29 12:41:00", "Forum": "panorama", "Positive": 2, "Negative": 0}, {"Date": "2020-03-29 12:37:00", "Forum": "web", "Positive": 6, "Negative": 0}, {"Date": "2020-03-29 12:37:00", "Forum": "web", "Positive": 2, "Negative": 2} ] } } # 初始化聚合字典,每个论坛对应一个包含正负分的字典 forum_stats = defaultdict(lambda: {"Positive": 0, "Negative": 0}) # 遍历所有帖子,累加分数 for post in input_data["Posting_Stats"]["Posts"]: forum = post["Forum"] forum_stats[forum]["Positive"] += post["Positive"] forum_stats[forum]["Negative"] += post["Negative"] # 转换成期望的列表格式 result = {"Forum_Stats": [{"Forum": k, **v} for k, v in forum_stats.items()]} # 输出JSON格式的结果 print(json.dumps(result, indent=2))
运行后得到的输出就是你想要的格式:
{ "Forum_Stats": [ { "Forum": "panorama", "Positive": 2, "Negative": 0 }, { "Forum": "web", "Positive": 8, "Negative": 2 } ] }
方法二:用pandas(适合处理大规模数据)
如果你的数据量很大,用pandas的分组聚合会更简洁高效:
import json import pandas as pd input_data = { "Posting_Stats": { "Posts": [ {"Date": "2020-03-29 12:41:00", "Forum": "panorama", "Positive": 2, "Negative": 0}, {"Date": "2020-03-29 12:37:00", "Forum": "web", "Positive": 6, "Negative": 0}, {"Date": "2020-03-29 12:37:00", "Forum": "web", "Positive": 2, "Negative": 2} ] } } # 把帖子数据转成DataFrame df = pd.DataFrame(input_data["Posting_Stats"]["Posts"]) # 按Forum分组,对Positive和Negative求和 aggregated = df.groupby("Forum")[["Positive", "Negative"]].sum().reset_index() # 转换成指定的JSON格式 result = {"Forum_Stats": aggregated.to_dict("records")} print(json.dumps(result, indent=2))
这个方法一行分组求和就搞定了,处理大量数据的时候优势很明显。
内容的提问来源于stack exchange,提问作者Nico Müller
相关产品推荐
相关产品推荐

