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

如何在Pandas DataFrame中标记满足掩码条件的最后一行

Pandas实现仅在满足掩码条件的最后一行赋值'x'

原始数据与需求

首先定义初始DataFrame:

import pandas as pd
df = pd.DataFrame({'a': [20, 21, 333, 444], 'b': [20, 20, 20, 20]})

需求:通过掩码 mask = (df.a >= df.b) 创建新列c,仅在满足该掩码条件的最后一行填入'x',其余行留空(显示NaN),期望输出如下:

a   b    c
0   20  20  NaN
1   21  20  NaN
2  333  20  NaN
3  444  20  x

无效代码分析

尝试的以下代码未达到预期:

df.loc[mask.cumsum().gt(1) & mask, 'c'] = 'x'

原因:mask.cumsum().gt(1) 会选中所有满足掩码且是第2个及以后的行,在本例中所有行都满足掩码,因此会给索引1、2、3的行都赋值'x',不符合仅最后一行赋值的需求。

正确实现方法

方法1:直接定位最后一个满足条件的索引

mask = df.a >= df.b
# 获取所有满足掩码的行的索引,取最后一个
last_idx = mask[mask].index[-1]
# 初始化c列为缺失值,再给目标行赋值
df['c'] = pd.NA
df.loc[last_idx, 'c'] = 'x'

方法2:利用移位掩码定位最后一行

mask = df.a >= df.b
# 构造最终掩码:当前行满足条件,且下一行不满足(或当前是最后一行)
final_mask = mask & (~mask.shift(-1, fill_value=False))
df['c'] = pd.NA
df.loc[final_mask, 'c'] = 'x'

方法3:通过累计求和的最大值定位

mask = df.a >= df.b
cum_sum = mask.cumsum()
# 找到累计求和值等于最大值的行(即最后一个满足条件的行)
final_mask = cum_sum == cum_sum.max()
df['c'] = pd.NA
df.loc[final_mask, 'c'] = 'x'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:06:03