如何在Pandas中基于Subject ID统计分数并生成字典?
解决方案:计算每个Subject ID的分数总和并存为字典
嘿,这问题我帮你搞定!这里有两种靠谱的解决方案,看哪种更适合你的场景:
方法一:使用Pandas(推荐,适合表格类数据处理)
如果你的数据是在表格文件(比如CSV、Excel)里,或者已经能转成DataFrame,用Pandas会非常高效:
import pandas as pd # 构造你的数据(如果是从文件读取,用pd.read_csv/pd.read_excel即可) data = { "subject": ["phchp005", "phchp005", "phchp006", "phchp006", "phchp006", "phchp006", "phchp006", "phchp006", "phchp006", "phchp006", "phchp006", "phchp008"], "Score": [1, 0, None, None, 0, 0, 0, 0, 1, 1, 1, None] } df = pd.DataFrame(data) # 步骤1:将NaN填充为0 df["Score"] = df["Score"].fillna(0) # 步骤2:按subject分组,计算每个组的Score总和 score_sum = df.groupby("subject")["Score"].sum().astype(int) # 步骤3:转成你需要的字典格式 result_dict = score_sum.to_dict() print(result_dict) # 输出:{'phchp005': 1, 'phchp006': 3, 'phchp008': 0}
解释:
fillna(0)自动把所有空值(NaN)替换成0,完美解决你的空值问题groupby("subject")["Score"].sum()会自动按Subject ID分组,计算每个组的分数总和astype(int)确保总和是整数类型(因为Pandas求和后可能是浮点数)to_dict()直接把分组后的结果转成键值对字典
方法二:纯Python手动处理(不依赖第三方库)
如果不想用Pandas,纯Python也能轻松实现:
# 先把你的数据整理成列表(每个元素是(subject, score)的元组) data_list = [ ("phchp005", 1), ("phchp005", 0), ("phchp006", None), ("phchp006", None), ("phchp006", 0), ("phchp006", 0), ("phchp006", 0), ("phchp006", 0), ("phchp006", 1), ("phchp006", 1), ("phchp006", 1), ("phchp008", None) ] # 初始化空字典用于存储结果 result_dict = {} # 遍历每一条数据 for subject, score in data_list: # 处理空值:如果score是None,替换成0 current_score = score if score is not None else 0 # 累加分数:如果ID已在字典里,就加;不在的话就初始化为当前分数 if subject in result_dict: result_dict[subject] += current_score else: result_dict[subject] = current_score print(result_dict) # 输出:{'phchp005': 1, 'phchp006': 3, 'phchp008': 0}
解释:
- 先把原始数据转成列表元组的形式(如果是从其他地方读取,你可以先做这一步转换)
- 遍历过程中手动处理空值,替换为0
- 通过判断Subject ID是否在字典中,实现分数的累加逻辑
两种方法都能得到你想要的结果,按需选择就行!
内容的提问来源于stack exchange,提问作者Guitarman045
相关产品推荐
相关产品推荐

