如何在列数可变的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
相关产品推荐
相关产品推荐

