如何用Pandas按日期生成受试者-实验员的两两组合
按日期分组生成受试者两两组合解决方案
问题背景
现有包含实验日期(Day)和受试者(Subject)的DataFrame,需要按日期分组,生成每组内受试者的所有两两组合,其中一个作为Subject,另一个作为Experimenter,而非全局跨日期的组合。
输入数据
| Day | Subject |
|---|---|
| Monday | Alpha |
| Monday | Bravo |
| Monday | Charlie |
| Wednesday | Delta |
| Wednesday | Echo |
| Wednesday | Foxtrot |
| Wednesday | Golf |
| Wednesday | Hotel |
解决方案代码
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)
代码说明
- 分组处理:通过
groupby('Day')将数据按日期拆分,确保仅在同日期的受试者间生成组合 - 生成组合:使用
itertools.combinations生成每组内的无序两两组合,避免重复(如(Alpha, Bravo)和(Bravo, Alpha)仅保留前者,符合示例期望输出) - 整理结果:通过
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
相关产品推荐
相关产品推荐

