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

Pandas按sub_code列筛选后替换marks列值时保留非筛选行原数据

问题解决:筛选DataFrame并替换指定行的列值

原始DataFrame

import pandas as pd

df = pd.DataFrame(
    {'stud_id' : [101, 101, 101, 101, 
                  101, 101, 101, 101],
     'sub_code' : ['CSE01', 'CSE02', 'CSE03', 
                   'CSE06', 'CSE05', 'CSE04',
                   'CSE07', 'CSE08'],
     'marks' : ['A','B','C','D',
                'E','F','G','H']}
)

需求

  • a) 根据sub_code列的指定值列表筛选DataFrame;
  • b) 将筛选出的行的marks列值替换为常量FAIL,同时保留非筛选行的原marks值。

错误尝试及问题

尝试了以下代码,但运行后非筛选行的marks列变为NA:

sub_list = ['CSE01', 'CSE02', 'CSE03','CSE06', 'CSE05', 'CSE04']
df['marks'] = df[df['sub_code'].isin(sub_list)]['marks'].replace(r'^([A-Za-z])*$','FAIL', regex=True)

问题原因:直接将筛选后的替换结果赋值给整个marks列时,筛选范围外的行在原筛选结果中是缺失值(NaN),因此赋值后这些位置会被覆盖为NA。

正确解决方案

方法1:使用loc精准定位赋值(推荐)

通过布尔索引定位符合条件的行,直接修改对应列的值,其他行不受影响:

sub_list = ['CSE01', 'CSE02', 'CSE03','CSE06', 'CSE05', 'CSE04']
df.loc[df['sub_code'].isin(sub_list), 'marks'] = 'FAIL'

执行后得到的结果:

stud_idsub_codemarks
101CSE01FAIL
101CSE02FAIL
101CSE03FAIL
101CSE06FAIL
101CSE05FAIL
101CSE04FAIL
101CSE07G
101CSE08H

方法2:使用mask函数替换

mask函数会将满足条件的位置替换为指定值,不满足条件的保留原值:

sub_list = ['CSE01', 'CSE02', 'CSE03','CSE06', 'CSE05', 'CSE04']
df['marks'] = df['marks'].mask(df['sub_code'].isin(sub_list), 'FAIL')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:50:47