如何用Python计算DataFrame中相同任务ID的用户答案一致性?
计算同任务ID的答案一致性方法
针对你的需求,核心思路是按hash分组后,统计每组内出现次数最多的答案的占比,同时处理「所有答案都不同」的特殊情况(返回0%)。以下是几种可行的Pandas实现方法:
方法一:自定义聚合函数
直接通过groupby结合自定义函数完成统计,逻辑清晰易懂:
import pandas as pd # 示例DataFrame df = pd.DataFrame({'hash': list('AAABBBCCCCDDD'), 'results': ['Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Perhaps', 'Yes', '404', 'Perhaps', 'Yes', 'No', 'Perhaps', ] }) def calc_consistency(group): # 统计每个答案的出现次数 count_stats = group.value_counts() max_count = count_stats.max() total = len(group) # 判断是否所有答案都唯一:最大出现次数为1,且不同答案数等于总样本数 if max_count == 1 and count_stats.nunique() == total: return 0.0 # 计算一致性百分比,保留1位小数 return round((max_count / total) * 100, 1) # 按hash分组计算一致性 consistency_result = df.groupby('hash')['results'].agg(calc_consistency).reset_index(name='consistency(%)') print(consistency_result)
方法二:分步统计后合并
通过分步统计总样本数、最大出现次数、不同答案数,再合并计算,适合需要中间统计结果的场景:
# 统计每个hash的总样本数 total_samples = df.groupby('hash').size().rename('total') # 统计每个hash下各答案的出现次数,取最大值 max_answer_count = df.groupby('hash')['results'].value_counts().groupby('hash').max().rename('max_count') # 统计每个hash下的不同答案数量 unique_answers = df.groupby('hash')['results'].nunique().rename('unique_count') # 合并统计结果并计算一致性 consistency_df = pd.concat([total_samples, max_answer_count, unique_answers], axis=1) consistency_df['consistency(%)'] = consistency_df.apply( lambda row: 0.0 if (row['max_count'] == 1 and row['unique_count'] == row['total']) else round((row['max_count'] / row['total']) * 100, 1), axis=1 ) # 提取最终结果 final_result = consistency_df.reset_index()[['hash', 'consistency(%)']] print(final_result)
关键说明
- 为什么
duplicated不适用:duplicated仅能标记重复行,无法直接统计分组内的最大重复次数,尤其当所有值都不重复时,无法提供有效统计维度。而value_counts可以直接输出每个答案的出现频次,完美覆盖所有场景。 - 特殊情况处理:当分组内所有答案都不同时(最大出现次数为1,且不同答案数等于总样本数),强制返回0%,符合你的需求。
示例输出
hash consistency(%) 0 A 66.7 1 B 100.0 2 C 50.0 3 D 0.0
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

