Pandas:统计当前实验参与者后续实验的排名提升情况(第一部分)
实现方案
核心思路
要解决这个问题,我们需要把每个参与者的跨实验排名关联起来,判断其后续实验的排名变化,再按当前实验分组统计目标指标。具体步骤如下:
- 明确实验顺序(A→B→C),避免后续匹配出错
- 为每个参与者按实验顺序排序,关联其下一个实验的排名
- 标记出排名提升和进入最高排名的情况
- 按当前实验分组统计符合条件的人数
代码实现
假设你已经加载了df_learning这个DataFrame,执行以下代码:
import pandas as pd # 1. 定义实验顺序,转换为有序类别保证排序逻辑正确 experiment_order = ['A', 'B', 'C'] df_learning['Experiment'] = pd.Categorical( df_learning['Experiment'], categories=experiment_order, ordered=True ) # 2. 按参与者和实验排序,关联后续实验的排名与实验名称 df_sorted = df_learning.sort_values(['Subject', 'Experiment']) df_sorted['Next_Rank'] = df_sorted.groupby('Subject')['Rank'].shift(-1) df_sorted['Next_Experiment'] = df_sorted.groupby('Subject')['Experiment'].shift(-1) # 3. 标记排名提升和进入最高排名的情况 # 排名提升:后续排名 < 当前排名(Rank越小越靠前),且存在后续实验 df_sorted['Rank_Improved'] = (df_sorted['Next_Rank'] < df_sorted['Rank']) & df_sorted['Next_Rank'].notna() # 进入最高排名:后续排名等于1,且存在后续实验 df_sorted['Reached_Top'] = (df_sorted['Next_Rank'] == 1) & df_sorted['Next_Rank'].notna() # 4. 按实验分组统计结果 result = df_sorted.groupby('Experiment').agg( 总参与者数=('Subject', 'nunique'), 排名提升人数=('Rank_Improved', 'sum'), 后续进入最高排名人数=('Reached_Top', 'sum') ).reset_index() print(result)
输出结果说明
运行代码后会得到如下统计结果:
| Experiment | 总参与者数 | 排名提升人数 | 后续进入最高排名人数 |
|---|---|---|---|
| A | 5 | 2 | 0 |
| B | 7 | 1 | 1 |
| C | 3 | 0 | 0 |
- 实验A:Charlie(排名从3→2)、Echo(排名从5→3)实现排名提升,无人后续进入Rank1
- 实验B:Juliet(排名从7→1)既实现排名提升,又进入了最高排名
- 实验C:无后续实验,两项计数均为0
内容的提问来源于stack exchange,提问作者matekus
相关产品推荐
相关产品推荐

