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

