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

如何删除DataFrame中每行的最后一个非NaN值?

问题描述

现有如下DataFrame:

a1a2a3Last_Not_NaN_Value
1NaNNaN1
00NaN0
NaN5NaN5

已通过以下代码获取到每行的最后一个非NaN值:

data.ffill(axis=1).iloc[:, -1] 

现在需要将原DataFrame中对应的这些最后一个非NaN值替换为NaN(即移除这些值)。

解决方案

可以通过定位每行最后一个非NaN值的位置,再将对应位置设为NaN,以下是两种可行的实现方式:

方法一:布尔掩码批量替换

import pandas as pd
import numpy as np

# 示例数据(已有目标data可跳过此步)
data = pd.DataFrame({
    'a1': [1, 0, np.nan],
    'a2': [np.nan, 0, 5],
    'a3': [np.nan, np.nan, np.nan]
})

# 获取每行最后一个非NaN值的列名
last_valid_cols = data.notna().cumsum(axis=1).idxmax(axis=1)

# 生成标记需要替换位置的布尔掩码
mask = pd.DataFrame([data.columns == col for col in last_valid_cols], 
                    index=data.index, columns=data.columns)

# 将标记位置的值设为NaN
data[mask] = np.nan

方法二:遍历行定位替换

这种方式逻辑更直观,适合快速理解:

import pandas as pd
import numpy as np

data = pd.DataFrame({
    'a1': [1, 0, np.nan],
    'a2': [np.nan, 0, 5],
    'a3': [np.nan, np.nan, np.nan]
})

# 获取每行最后一个非NaN值的列索引
last_valid_pos = data.notna().apply(lambda row: row.last_valid_index(), axis=1)

# 遍历每行,将对应位置设为NaN
for idx, col in last_valid_pos.items():
    if col is not None:  # 避免整行都是NaN的情况报错
        data.loc[idx, col] = np.nan

执行后原DataFrame会更新为:

a1a2a3
NaNNaNNaN
0NaNNaN
NaNNaNNaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:55:18