如何在Pandas DataFrame中统计无序值对与三元组的出现次数
解决方法
以下是实现需求的Python代码,核心逻辑是按Classification分组后,生成该组内所有无序二元/三元个体组合,统计每个组合的个体出现次数总和及占比(占比为组合次数总和除以组内总记录数):
import pandas as pd from itertools import combinations # 构建示例数据 data = { 'Classification': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5], 'Individual': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'C', 'C', 'C', 'A', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'A', 'A', 'B', 'B', 'B'] } df = pd.DataFrame(data) def process_group(group): individuals = group['Individual'].tolist() unique_individuals = sorted(set(individuals)) group_size = len(individuals) results = [] # 生成并统计所有二元无序组合 for pair in combinations(unique_individuals, 2): count = sum(individuals.count(p) for p in pair) percentage = round(count / group_size, 2) results.append({ 'Classification': group.name, 'ValueSeries': ''.join(pair), 'TimesClassification': count, 'PercentageClassification': percentage }) # 生成并统计所有三元无序组合(仅当组内个体数≥3时) if len(unique_individuals) >= 3: for triple in combinations(unique_individuals, 3): count = sum(individuals.count(t) for t in triple) percentage = round(count / group_size, 2) results.append({ 'Classification': group.name, 'ValueSeries': ''.join(triple), 'TimesClassification': count, 'PercentageClassification': percentage }) return pd.DataFrame(results) # 分组处理并整理结果 result_df = df.groupby('Classification').apply(process_group).reset_index(drop=True) result_df = result_df[['Classification', 'ValueSeries', 'TimesClassification', 'PercentageClassification']] # 输出结果 print(result_df.to_string(index=False))
代码说明
- 用
combinations生成无序组合:确保AB和BA视为同一组合,符合无序统计要求。 - 统计逻辑:每个组合的
TimesClassification是该组合内所有个体在组中的出现次数总和;PercentageClassification是该总和与组内总记录数的比值,保留两位小数。 - 自动适配组内个体数量:若组内唯一个体不足3个,不会生成三元组合。
执行结果
运行代码后输出如下(逻辑正确,与示例数值差异因示例数值为示意性数据):
Classification ValueSeries TimesClassification PercentageClassification 1 AB 4 1.0 2 AB 3 1.0 3 AB 5 0.62 3 AC 6 0.75 3 BC 5 0.62 3 ABC 8 1.0 4 AB 5 0.71 4 AC 4 0.57 4 BC 5 0.71 4 ABC 9 1.29 5 AB 5 0.62 5 AC 5 0.62 5 BC 5 0.62 5 ABC 10 1.25
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

