如何用Python Itertools统计CSV中高频二人组/三人组?
解决方案:统计CSV中出现次数最多的二人组与三人组
嘿,我完全懂你的处境——Excel确实搞不定这种不考虑姓名顺序的组合统计,而Python的itertools模块又有点让人摸不着头脑。别慌,我给你准备了一套现成的代码,步骤清晰,你跟着做就行,不需要太深入懂原理!
准备工作
你只需要确保你的电脑装了Python(现在大部分电脑都自带,没有的话装个最新版就行),然后把你的CSV文件和下面的代码放在同一个文件夹里。
完整代码
import csv from itertools import combinations from collections import defaultdict # 初始化计数字典:键是排序后的组合,值是出现次数 pair_counts = defaultdict(int) triple_counts = defaultdict(int) # 读取CSV文件(把这里的'your_file.csv'改成你实际的文件名) with open('your_file.csv', 'r', encoding='utf-8') as file: reader = csv.reader(file) next(reader) # 跳过表头行(如果你的CSV没有表头,就删掉这一行) for row in reader: # 获取当前行的三个姓名,去掉空白字符 people = [name.strip() for name in row if name.strip()] # 确保当前行有三个有效姓名(避免空值影响统计) if len(people) != 3: continue # 统计二人组:生成所有两两组合,排序后作为唯一键 for pair in combinations(people, 2): sorted_pair = tuple(sorted(pair)) pair_counts[sorted_pair] += 1 # 统计三人组:排序后作为唯一键 sorted_triple = tuple(sorted(people)) triple_counts[sorted_triple] += 1 # 找出出现次数最多的二人组和三人组 most_common_pair = max(pair_counts.items(), key=lambda x: x[1]) most_common_triple = max(triple_counts.items(), key=lambda x: x[1]) # 打印结果 print(f"出现次数最多的二人组:{most_common_pair[0]},共出现{most_common_pair[1]}次") print(f"出现次数最多的三人组:{most_common_triple[0]},共出现{most_common_triple[1]}次")
怎么用?
- 把代码里的
'your_file.csv'改成你实际的CSV文件名(比如'names_data.csv') - 如果你的CSV没有表头行(第一行就是数据),删掉代码里的
next(reader)这一行 - 打开命令行,进入代码所在的文件夹,运行
python count_groups.py(把count_groups.py改成你保存代码的文件名)
关键逻辑说明
- 为什么要排序?因为
(PersonA, PersonB)和(PersonB, PersonA)其实是同一个组合,排序后就能统一成同一个键,确保统计准确 combinations用来生成所有可能的两两组合,不用自己手动写循环defaultdict是Python自带的工具,方便我们计数,不用手动判断键是否存在
要是运行时遇到小问题(比如文件找不到、编码错误),可以调整代码里的encoding参数(比如改成gbk),或者检查文件名有没有写错~
内容的提问来源于stack exchange,提问作者Michael T Johnson
相关产品推荐
相关产品推荐

