如何在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
相关产品推荐
相关产品推荐

