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

Python实现动态变化子集内的配对查找

嘿,我来帮你搞定这个在动态子集中查找配对的问题!从你给出的数据集来看,核心需求应该是按Event划分的每个动态分组里,找出Indiv1和Indiv2的关联配对对吧?下面我分几种常见场景给你演示具体实现方式:

步骤1:先明确配对的定义

首先得先对齐需求:这里的“配对”可以是所有行的原始组合、去重后的唯一组合,或是结合其他变量的复杂配对。我会针对这几种情况分别给出实现代码。

步骤2:基础配对实现(按Event分组)

先把你的数据集加载好(我已经帮你补全了代码开头):

import pandas as pd

# 你的原始数据集
d1 = {'Indiv1':['Subject1','Subject2','Subject1','Subject1','Subject2','Subject1','Subject1','Subject2'], 
      'Indiv2': ['Subject4','Subject3','Subject2','Subject4','Subject4','Subject2','Subject3','Subject3'], 
      'Event':['1','1','2','2','2','3','3','3'], 
      'Category':['1','2','1','1','1','2','2','2'], 
      'Variable1':['1','2','3','4','5','6','7','8'], 
      'Variable2':['12','11','10','9','8','7','6','5'], 
      'Variable3': ['-4','-3','-2','-1','0','1','2','3']}
d1 = pd.DataFrame(d1)

场景1:获取每个Event下的所有原始配对(含重复)

如果需要保留每一行的Indiv1和Indiv2组合,直接生成配对列后按Event分组即可:

# 把Indiv1和Indiv2组合成元组,方便后续处理
d1['Pair'] = list(zip(d1['Indiv1'], d1['Indiv2']))

# 按Event分组,提取每个组的所有配对
grouped_raw_pairs = d1.groupby('Event')['Pair'].apply(list).reset_index()
print(grouped_raw_pairs)

输出结果:

Event                                               Pair
0     1  [(Subject1, Subject4), (Subject2, Subject3)]
1     2  [(Subject1, Subject2), (Subject1, Subject4), (Subject2, Subject4)]
2     3  [(Subject1, Subject2), (Subject1, Subject3), (Subject2, Subject3)]

场景2:获取每个Event下的唯一配对(去重)

如果只需要每个Event中不重复的配对,用set去重即可:

unique_grouped_pairs = d1.groupby('Event')['Pair'].apply(lambda x: list(set(x))).reset_index()
print(unique_grouped_pairs)

输出结果:

Event                                               Pair
0     1  [(Subject2, Subject3), (Subject1, Subject4)]
1     2  [(Subject1, Subject2), (Subject2, Subject4), (Subject1, Subject4)]
2     3  [(Subject1, Subject3), (Subject2, Subject3), (Subject1, Subject2)]

场景3:统计每个Event下各配对的出现次数

如果需要知道每个配对在对应Event里的出现频次,用value_counts统计:

pair_count_df = d1.groupby('Event')['Pair'].value_counts().reset_index(name='Count')
print(pair_count_df)

输出结果(你的示例数据中每个配对仅出现1次,若有重复会显示对应次数):

Event                  Pair  Count
0     1  (Subject1, Subject4)      1
1     1  (Subject2, Subject3)      1
2     2  (Subject1, Subject4)      1
3     2  (Subject1, Subject2)      1
4     2  (Subject2, Subject4)      1
5     3  (Subject1, Subject3)      1
6     3  (Subject2, Subject3)      1
7     3  (Subject1, Subject2)      1
步骤3:复杂配对逻辑(结合其他变量)

如果你的配对需要结合Category这类额外变量(比如只找同一Event+同一Category下的配对),可以自定义分组逻辑:

def get_category_pairs(group):
    # 每个Event下再按Category分组,提取对应配对
    return group.groupby('Category').apply(lambda g: list(zip(g['Indiv1'], g['Indiv2']))).to_dict()

complex_pairs_df = d1.groupby('Event').apply(get_category_pairs).reset_index(name='Category_Pairs')
print(complex_pairs_df)

输出结果:

Event                                  Category_Pairs
0     1  {'1': [(Subject1, Subject4)], '2': [(Subject2, Subject3)]}
1     2  {'1': [(Subject1, Subject2), (Subject1, Subject4), (Subject2, Subject4)]}
2     3  {'2': [(Subject1, Subject2), (Subject1, Subject3), (Subject2, Subject3)]}

内容的提问来源于stack exchange,提问作者Prometheus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:47