如何从活动-宾客列表中找出共同出席次数最多的宾客配对?
嘿,这个问题其实是数据领域里挺常见的关联统计需求,我给你梳理一套清晰的实操流程,不管你数据量多大都能落地:
第一步:先把数据转成「长格式」结构化数据
不管你原始数据是Excel表格、CSV还是其他格式,首先要整理成每行对应一个活动+一个宾客的结构。比如原来一个活动行里列了多个宾客,就得拆成多行——比如活动"年会"有John、Jane、Bob,就拆成3行:
年会 | John
年会 | Jane
年会 | Bob
这一步是后续所有统计的基础,避免机器处理时因为格式混乱出错。如果是Excel里的多列宾客,用「数据分列+逆透视」就能快速搞定。
第二步:为每个活动生成所有无序宾客配对
对每个活动里的宾客列表,生成所有无序配对组合(重点:John&Jane和Jane&John算同一组,不能重复计数)。比如刚才的年会,配对就是(John,Jane)、(John,Bob)、(Jane,Bob)。
这里如果手动做肯定不现实,用工具的话:
- 用Python可以借助
itertools.combinations函数,它专门生成不重复的两两组合; - 用SQL的话,可以通过自连接表来实现,记得加条件
guest_id1 < guest_id2(用ID或者姓名排序)来避免重复配对。
第三步:统计每对的共同出席次数
把所有活动生成的配对汇总,统计每一组配对出现的次数——这就是他们共同出席的活动数。
给你两个常用工具的实现示例:
Python(适合大数据量)
import pandas as pd from itertools import combinations # 假设你的数据存在df里,列名是event(活动)和guest(宾客) # 按活动分组,每组生成两两配对 pair_series = df.groupby('event')['guest'].apply( lambda guests: pd.Series(list(combinations(guests, 2))) ) # 统计每对出现的次数 pair_counts = pair_series.value_counts().reset_index(name='共同出席次数')
SQL(适合数据库存储的大数据)
-- 假设表名为event_guests,字段是event_id, guest_id, guest_name SELECT g1.guest_name AS guest1, g2.guest_name AS guest2, COUNT(DISTINCT g1.event_id) AS 共同出席次数 FROM event_guests g1 JOIN event_guests g2 ON g1.event_id = g2.event_id AND g1.guest_id < g2.guest_id -- 避免重复配对 GROUP BY g1.guest_name, g2.guest_name ORDER BY 共同出席次数 DESC;
第四步:筛选出次数最多的配对
统计完成后,找到「共同出席次数」的最大值,然后筛选出所有等于这个最大值的配对就行。如果有多个配对并列第一,都会被筛选出来。
针对超大规模数据的优化提示
- 尽量用宾客ID代替姓名统计,避免同名同姓导致的统计错误;
- 如果数据量超过10万行,Python里可以用
Dask代替Pandas做并行处理,防止内存溢出; - 要是用Excel处理小数据量,可以用辅助列生成配对,再用
COUNTIFS统计,但数据量大时效率极低,不推荐。
内容的提问来源于stack exchange,提问作者Kimberly
相关产品推荐
相关产品推荐

