如何用Pandas基于多行列条件将合格课程标记为Superseded?
高效处理Pandas中课程替代标记需求
需求说明
需将满足以下全部条件的课程Result字段修改为Superseded:
- 该课程的
Result为Pass Superseded_by列中的课程存在于当前记录的Course列中- 被替代课程(
Superseded_by对应课程)的Result也为Pass
原始数据
import pandas as pd df = pd.DataFrame({ 'Course': ['A', 'B', 'C', 'D', 'E','F','G'], 'Result': ['Pass', 'Fail', 'Pass', 'Fail', 'Pass','Fail','Pass'], 'Superseded_by':['E','E','F','F','','','H'] }) print(df)
输出:
Course Result Superseded_by 0 A Pass E 1 B Fail E 2 C Pass F 3 D Fail F 4 E Pass 5 F Fail 6 G Pass H
高效实现方案
利用Pandas矢量化操作+字典映射,避免低效的跨行循环,代码如下:
# 构建课程到结果的映射字典,实现O(1)快速查询 course_result_map = df.set_index('Course')['Result'].to_dict() # 生成三个条件的布尔掩码 condition1 = df['Result'] == 'Pass' condition2 = df['Superseded_by'].isin(course_result_map) condition3 = df['Superseded_by'].map(course_result_map) == 'Pass' # 合并条件,批量修改符合要求的Result值 df.loc[condition1 & condition2 & condition3, 'Result'] = 'Superseded' print(df)
输出结果:
Course Result Superseded_by 0 A Superceded E 1 B Fail E 2 C Pass F 3 D Fail F 4 E Pass 5 F Fail 6 G Pass H
方案优势
- 字典映射实现O(1)复杂度的课程结果查询,比
merge或apply循环效率高得多 - 布尔索引是Pandas原生矢量化操作,批量处理数据性能最优,适合大规模数据集
内容的提问来源于stack exchange,提问作者ic198
相关产品推荐
相关产品推荐

