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

如何在Pandas中逐行找出非空、非NaN、非'Nope'的最后一列

高效实现Pandas逐行查找最后一个有效列的方法

需求明确:给下面这个Pandas DataFrame,逐行找出最后一个值不为空字符串、非NaN、也不是'Nope'的列。

可复现的输入DataFrame:

import pandas as pd

df = pd.DataFrame({'a1': [1, 1, 1],
                   'a2': [float('nan'), 1, 1],
                   'a3': [1, 1, 1],
                   'a4': [1, 1, 1],
                   'a5': [1, 1, 1],
                   'a6': ['', 'Nope', 1],
                   'a7': ['', 1, '']})

如果用apply逐行反向检查,虽然能得到结果,但本质是行级循环,数据量大的时候效率拉胯。下面用Pandas向量化运算实现更高效的方案:

步骤1:生成有效元素的掩码

先创建一个布尔掩码,标记每个元素是否符合要求(非NaN、非空字符串、不是'Nope'):

mask = ~df.isna() & (df != '') & (df != 'Nope')

步骤2:反向查找最后一个有效列

因为要找最后一个有效列,我们可以先把列反转,然后用idxmax找每行第一个为True的列(对应原数据里的最后一个有效列):

# 反转列顺序
reversed_mask = mask.loc[:, ::-1]
# 找每行第一个True对应的列名,也就是原数据的最后一个有效列
last_valid_cols = reversed_mask.idxmax(axis=1)

步骤3:输出结果

按示例格式打印每行对应的列:

for idx, col in enumerate(last_valid_cols, start=1):
    print(f"{idx} Row: Column ({col})")

运行后就能得到和示例一致的输出:

1 Row: Column (a5)
2 Row: Column (a7)
3 Row: Column (a6)

为什么这个方法更高效?

所有操作都是Pandas的向量化运算,完全避开了逐行循环,处理大规模数据集时,速度会比apply方法快一个量级以上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:52:39