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

如何将DataFrame分组后每组最后n个非NaN值设为NaN?

问题描述

我有一个包含若干分组变量和数值变量的DataFrame,目标是将每组中的最后n个非NaN值设置为NaN。

示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame({'id':[1,1,1,2,2],
                  'value':[1,2,np.nan, 9,8]})

原始输出

id  value
0   1    1.0
1   1    2.0
2   1    NaN
3   2    9.0
4   2    8.0

期望结果(当n=1时)

id  value
0   1    1.0
1   1    NaN
2   1    NaN
3   2    9.0
4   2    NaN

解决方案

可以通过groupby结合反向累计计数实现:

n = 1

# 对每个分组,筛选出需要设为NaN的最后n个非空值位置
mask = df.groupby('id')['value'].apply(
    lambda x: x.notna() & (x.notna()[::-1].cumsum() <= n)
)

# 将标记位置的value设为NaN
df.loc[mask, 'value'] = np.nan

代码说明

  • x.notna():筛选当前分组中数值非空的位置
  • x.notna()[::-1].cumsum():反转非空位置序列后累计计数,得到从最后一个非NaN值开始的序号
  • <=n:锁定每组最后n个非NaN值的位置
  • 用loc定位目标位置并设置为NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:33