Pandas中仅当_ans后缀列中10出现1次时执行掩码操作的实现问题
实现方案
你只需要在循环逻辑中新增10出现次数的判断条件即可,修改后完整代码如下:
import pandas as pd df = pd.DataFrame(data={'a_ans':[0,1,1,10,11], 'a_num': [1,8,90,2,8], 'b_ans': [0,10,139,10,18], 'b_num': [15,43,90,14,87]}).astype(float) out=[] for i in ['a_', 'b_']: pairs = df.loc[:,df.columns.str.startswith(i)] # 取对应前缀的配对列 ans_col = pairs[i+'ans'] # 统计当前_ans列中10的出现次数 count_10 = (ans_col == 10).sum() if count_10 == 1: # 仅当10仅出现1次时执行掩码替换 mask1 = ans_col == 10 mask2 = ans_col.eq(ans_col.mask(mask1).max()) pairs = pairs.mask(mask1, 1001).mask(mask2, 1002) # 不满足条件的列直接保留原始值 out.append(pairs) # 可直接合并为完整DataFrame使用 result = pd.concat(out, axis=1)
改动说明
- 新增
count_10变量统计对应_ans列中值等于10的行数 - 新增判断逻辑,仅当
count_10 == 1时执行原有的掩码替换逻辑,不符合条件的列完全保留原始值 - 新增
pd.concat步骤可直接将输出列表合并为完整DataFrame,方便后续处理
运行后仅a_ans对应的配对列会执行替换,b_ans对应的列完全保留原始值,符合需求。
内容的提问来源于stack exchange,提问作者an10b3
相关产品推荐
相关产品推荐

