如何通过Pandas成对比较剔除被支配实验样本?
多准则筛选DataFrame中的被支配样本实现方案
1. 生成两两样本的胜负平统计
先提取DataFrame中的数值指标列(排除Subject列),遍历所有两两样本组合,对每对样本的指标逐一做“小于”比较,统计以下三个值:
w:样本i的指标小于样本j的次数(样本i赢的次数)l:样本i的指标大于样本j的次数(样本i输的次数)d:样本i与样本j指标相等的次数(平局次数)
实现代码:
import pandas as pd # 构建示例DataFrame df = pd.DataFrame({'Subject': ['Alpha', 'Bravo', 'Charlie'], 'A': [6, 7, 8], 'B': [11, 7, 12], 'C': [13, 6, 6], 'D': [5, 9, 4], 'E': [11, 9, 5], 'F': [9, 10, 3], 'G': [2, 6, 5], 'H': [8, 12, 11]}) # 提取数值指标与样本名称 metrics = df.drop('Subject', axis=1).values subjects = df['Subject'].tolist() n_samples = len(subjects) # 生成两两比较结果 comparison_results = [] for i in range(n_samples): for j in range(i+1, n_samples): comp = metrics[i] < metrics[j] w = comp.sum() l = (metrics[i] > metrics[j]).sum() d = (metrics[i] == metrics[j]).sum() comparison_results.append(f"[{i}, {j}]: w={w}, l={l}, d={d}") # 输出比较结果 for res in comparison_results: print(res)
运行后输出:
[0, 1]: w=5, l=3, d=0 [0, 2]: w=4, l=4, d=0 [1, 2]: w=2, l=5, d=1
2. 筛选并移除被支配样本
依据给定的伪代码逻辑(阈值tx=3),判断每对样本的胜负关系:
- 若样本i赢次数
w大于输次数l,且l < tx,则样本j为被支配样本 - 若样本i赢次数
w小于输次数l,且w < tx,则样本i为被支配样本
收集所有被支配样本后,从原DataFrame中移除:
tx = 3 dominated_subjects = set() # 遍历两两组合筛选被支配样本 for i in range(n_samples): for j in range(i+1, n_samples): comp = metrics[i] < metrics[j] w = comp.sum() l = (metrics[i] > metrics[j]).sum() if w > l and l < tx: dominated_subjects.add(subjects[j]) elif w < l and w < tx: dominated_subjects.add(subjects[i]) # 输出被支配样本列表 dominated_list = list(dominated_subjects) print("被支配样本列表:", dominated_list) # 输出: ['Bravo'] # 移除被支配样本,生成筛选后的DataFrame filtered_df = df[~df['Subject'].isin(dominated_list)] print("筛选后的DataFrame:\n", filtered_df)
内容的提问来源于stack exchange,提问作者matekus
相关产品推荐
相关产品推荐

