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
相关产品推荐
相关产品推荐

