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

如何用Pandas按日期生成受试者-实验员的两两组合

按日期分组生成受试者两两组合解决方案

问题背景

现有包含实验日期(Day)和受试者(Subject)的DataFrame,需要按日期分组,生成每组内受试者的所有两两组合,其中一个作为Subject,另一个作为Experimenter,而非全局跨日期的组合。

输入数据

DaySubject
MondayAlpha
MondayBravo
MondayCharlie
WednesdayDelta
WednesdayEcho
WednesdayFoxtrot
WednesdayGolf
WednesdayHotel

解决方案代码

import pandas as pd
import itertools as it

# 构造输入DataFrame
df = pd.DataFrame({'Day': ['Monday', 'Monday', 'Monday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday'],
                    'Subject': ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel']})

# 按日期分组生成两两组合
result = df.groupby('Day').apply(
    lambda group: pd.DataFrame(
        it.combinations(group['Subject'], 2),  # 生成无序两两组合(无重复对)
        columns=['Subject', 'Experimenter']
    )
).reset_index(level=1, drop=True).reset_index()

# 查看结果
print(result)

代码说明

  1. 分组处理:通过groupby('Day')将数据按日期拆分,确保仅在同日期的受试者间生成组合
  2. 生成组合:使用itertools.combinations生成每组内的无序两两组合,避免重复(如(Alpha, Bravo)和(Bravo, Alpha)仅保留前者,符合示例期望输出)
  3. 整理结果:通过reset_index清理分组产生的索引,将日期列恢复为普通列,最终得到结构符合要求的DataFrame

可选扩展(生成双向组合)

如果需要保留双向组合(即每个受试者都能作为Subject对应其他所有Experimenter,包括反向),只需将it.combinations替换为it.permutations:

# 生成有序两两组合(包含双向对)
result = df.groupby('Day').apply(
    lambda group: pd.DataFrame(
        it.permutations(group['Subject'], 2),
        columns=['Subject', 'Experimenter']
    )
).reset_index(level=1, drop=True).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:35:10