如何在DataFrame中通过重复行添加多值行对应的列名?
解决方案
核心思路
先识别每行中DELTA、BETA、GAMMA列里非空值对应的列名,再通过行展开的方式将这些列名映射到新增的NEW列,同时保留原行的所有数据。
代码实现
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame({ 'ALPHA': ['#', '#', '#', '#'], 'DELTA': [1, np.nan, np.nan, 8], 'BETA': [np.nan, 2, np.nan, 4], 'GAMMA': [np.nan, 5, 3, 5] }) # 1. 为每行生成有效列名列表(仅处理DELTA/BETA/GAMMA列) df['NEW'] = df[['DELTA', 'BETA', 'GAMMA']].apply(lambda x: x.dropna().index.tolist(), axis=1) # 2. 将列表展开为多行,自动复制原行数据 df = df.explode('NEW').reset_index(drop=True) # 3. 调整列顺序,把NEW列移到最前面 cols = ['NEW'] + [col for col in df.columns if col != 'NEW'] df = df[cols] print(df)
输出结果
运行后得到的DataFrame与目标完全一致:
NEW ALPHA DELTA BETA GAMMA 0 DELTA # 1 NaN NaN 1 BETA # NaN 2 5 2 GAMMA # NaN 2 5 3 GAMMA # NaN NaN 3 4 DELTA # 8 4 5 5 BETA # 8 4 5 6 GAMMA # 8 4 5
关键逻辑说明
apply(lambda x: x.dropna().index.tolist(), axis=1):遍历每行,筛选出非空值对应的列名并生成列表explode('NEW'):将列表中的每个元素拆分为单独行,自动复制原行的其他字段数据- 列顺序调整:确保
NEW列位于最左侧,匹配目标格式
内容的提问来源于stack exchange,提问作者Adrien Lambert
相关产品推荐
相关产品推荐

