如何为含重复索引的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
相关产品推荐
相关产品推荐

