You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_idXY_ID
A4
A5
B4
B5
B6
C4

需求

提取XY_ID列的所有不重复值,生成所有两两组合的升序二元组,统计每个二元组对应的两个XY_ID值共同关联的order_id数量,预期输出:

XY_ID_Tuple_IDX1XY_ID_Tuple_ID2order count
452
561
461

计数规则:

  • 二元组(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:12:26