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

如何在列数可变的Pandas DataFrame中提取每行最后一个非空值

动态处理可变列数的DataFrame,新增Latest列

我有一个列格式为Col.x且列数未知的DataFrame,样例数据如下:

Col.1,Col.2,Col.3
Val1,,
Val2,Val3,
Val3,,
Val4,Val2,Val3

需要新增一个Latest列,填充每行中x编号最大的非空列的值,预期效果如下:

Col.1,Col.2,Col.3,Latest
Val1,,,Val1
Val2,Val3,,Val3
Val3,,,Val3
Val4,Val2,Val3,Val3

之前的解决方案依赖已知列名,无法灵活适配列数变化的场景:

df["Latest"] = np.where(df["Col.3"].isnull(),np.where(df["Col.2"].isnull(),df["Col.1"],df["Col.2"]),df["Col.3"])

目前已能通过以下代码筛选出所有Col.x格式的目标列:

cols = [col for col in df.columns if 'Col' in col]

可扩展的解决方案

首先需要确保目标列按Col.x中的x编号升序排列,避免列顺序混乱导致结果错误:

# 提取Col.x中的数字部分,按数字大小排序列
cols_sorted = sorted(cols, key=lambda col: int(col.split('.')[1]))

方法一:使用bfill向后填充

bfill(axis=1)会从右向左填充每行的空值,取每行最右侧的非空值,正好匹配需求:

df['Latest'] = df[cols_sorted].bfill(axis=1).iloc[:, -1]

方法二:使用apply结合last_valid_index

对每行遍历,找到最后一个非空值对应的列索引,再提取该位置的值:

df['Latest'] = df[cols_sorted].apply(lambda row: row[row.last_valid_index()], axis=1)

以上两种方法均不依赖固定列数,只要能正确筛选并排序Col.x列,无论列数多少都能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:06:32