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

如何为含重复索引的Pandas DataFrame生成非空值列名列

问题需求

现有一个带有重复索引的Pandas DataFrame,需要按行创建新列col_names,将每行中所有非NaN值对应的列名以逗号分隔的形式拼接起来。

示例数据

创建示例DataFrame的代码

import pandas as pd
import numpy as np

so_df = pd.DataFrame({"ma_1":[10,np.nan,13,15],
             "ma_2":[10,11,np.nan,15],
             "ma_3":[np.nan,11,np.nan,15]},index=[0,1,1,2])

初始DataFrame展示

ma_1  ma_2  ma_3
0  10.0  10.0   NaN
1   NaN  11.0  11.0
1  13.0   NaN   NaN
2  15.0  15.0  15.0

解决方案

方法1:逐行处理(代码简洁直观)

利用apply遍历每行,过滤掉NaN值后拼接列名:

so_df['col_names'] = so_df.apply(lambda row: ', '.join(row.dropna().index), axis=1)

方法2:高效分组处理(适合大数据量)

通过stack将非NaN值的列名与行索引关联,再按行索引分组拼接:

# 提取非NaN值对应的行索引和列名
stacked_data = so_df.stack().reset_index(level=1)
# 按行索引分组,拼接列名
so_df['col_names'] = stacked_data.groupby(level=0)['level_1'].agg(', '.join)

最终结果

执行上述任意一种方法后,得到的DataFrame如下:

ma_1  ma_2  ma_3          col_names
0   10.0  10.0   NaN        ma_1, ma_2
1    NaN  11.0  11.0        ma_2, ma_3
1   13.0   NaN   NaN              ma_1
2   15.0  15.0  15.0  ma_1, ma_2, ma_3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:55:14