如何为DataFrame添加列存储每行首个非NaN/Null的列名
为DataFrame添加首个非空列名列的实现方法
示例需求
基于DataFrame的A、B、C、D列,生成名为First的新列,存储每行中首个非NaN/Null值所在的列名;若该行所有目标列均为空,则First列设为Null。示例结果如下:
Name A B C D First
Alex 100 NaN Null NaN A
Michael 300 400 Null Null A
Steve Null 100 100 100 B
John Null Null NaN Null Null
实现代码
1. 构造示例数据
import pandas as pd import numpy as np data = { 'Name': ['Alex', 'Michael', 'Steve', 'John'], 'A': [100, 300, np.nan, np.nan], 'B': [np.nan, 400, 100, np.nan], 'C': [np.nan, np.nan, 100, np.nan], 'D': [np.nan, np.nan, 100, np.nan] } df = pd.DataFrame(data)
2. 生成First列
# 指定需要检查的目标列 target_cols = ['A', 'B', 'C', 'D'] # 标记非空值为True,取每行首个True对应的列名 df['First'] = df[target_cols].notna().idxmax(axis=1) # 处理所有目标列均为空的行,设为NaN(对应示例中的Null) all_null_mask = df[target_cols].isna().all(axis=1) df.loc[all_null_mask, 'First'] = np.nan
3. 查看结果
执行print(df)后输出:
Name A B C D First 0 Alex 100.0 NaN NaN NaN A 1 Michael 300.0 400.0 NaN NaN A 2 Steve NaN 100.0 100.0 100.0 B 3 John NaN NaN NaN NaN NaN
代码说明
notna():将DataFrame中的非空值转换为True,空值转换为False,便于定位首个非空位置idxmax(axis=1):返回每行中第一个True对应的列名,即该行首个非空值所在的列isna().all(axis=1):筛选出所有目标列均为空的行,将这些行的First列设为NaN,匹配示例中的Null场景
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

