Python pandas统计XY_ID两两二元组关联的公共order_id数量
问题描述
测试数据集
使用如下代码构造测试数据:
import pandas as pd dt = {'order_id': ['A','A','B','B','B','C'], 'XY_ID': [4,5,4,5,6,4]} df = pd.DataFrame(data=dt)
生成的DataFrame结构如下:
| order_id | XY_ID |
|---|---|
| A | 4 |
| A | 5 |
| B | 4 |
| B | 5 |
| B | 6 |
| C | 4 |
需求
提取XY_ID列的所有不重复值,生成所有两两组合的升序二元组,统计每个二元组对应的两个XY_ID值共同关联的order_id数量,预期输出:
| XY_ID_Tuple_IDX1 | XY_ID_Tuple_ID2 | order count |
|---|---|---|
| 4 | 5 | 2 |
| 5 | 6 | 1 |
| 4 | 6 | 1 |
计数规则:
- 二元组(4,5)计数为2:order_id A、B同时关联了4和5两个值
- 二元组(5,6)计数为1:仅order_id B同时关联了5和6两个值
- 二元组(4,6)计数为1:仅order_id B同时关联了4和6两个值
此前尝试使用df.groupby(['col1', 'col2']).size().reset_index(name='count')以及pivot_table()方法均未得到符合预期的结果。
解决方案
实现逻辑:按订单ID分组,对每个订单关联的XY_ID排序后生成不重复的升序二元组,最后统计所有二元组的出现次数即可。需要使用标准库itertools.combinations生成无重复组合。
import pandas as pd from itertools import combinations # 构造原始数据集 dt = {'order_id': ['A','A','B','B','B','C'], 'XY_ID': [4,5,4,5,6,4]} df = pd.DataFrame(data=dt) pair_collector = [] # 按订单分组遍历 for order_id, group_df in df.groupby('order_id'): # 取当前订单下所有去重的XY_ID并排序,保证生成的二元组为升序 xy_set = sorted(group_df['XY_ID'].unique()) # 生成所有长度为2的不重复组合 id_pairs = combinations(xy_set, 2) pair_collector.extend(id_pairs) # 转为DataFrame后分组计数 result = pd.DataFrame( pair_collector, columns=['XY_ID_Tuple_IDX1', 'XY_ID_Tuple_ID2'] ).groupby(['XY_ID_Tuple_IDX1', 'XY_ID_Tuple_ID2'], as_index=False) .size() .rename(columns={'size': 'order count'}) print(result)
运行输出:
XY_ID_Tuple_IDX1 XY_ID_Tuple_ID2 order count 0 4 5 2 1 4 6 1 2 5 6 1
逻辑说明
- 分组后对每个订单的XY_ID先排序再生成组合,避免出现(5,4)这类逆序二元组导致重复计数
combinations本身不会生成重复元素的组合,也不会生成顺序相反的重复对,完全符合升序二元组的要求- 只有单个XY_ID的订单(比如示例中的订单C)不会生成任何二元组,自然不会被计入统计,符合业务逻辑
内容的提问来源于stack exchange,提问作者ShivAA
相关产品推荐
相关产品推荐

