Python pandas DataFrame操作:通过melt与groupby获取值对应所在列名
解决方案
首先给出完整可运行代码:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'col1': ['B', 'E', np.nan], 'col2': ['C', 'D', 'F'], 'col3': ['A', 'G', 'B'] }) # 核心转换逻辑 # 1. 宽表转长表,过滤空值 df_melt = df.melt(var_name='location', value_name='Name').dropna(subset=['Name']) # 2. 按名称分组,拼接所有出现的列名 result = df_melt.groupby('Name', as_index=False, sort=False)['location'].agg(','.join) # 输出结果 print(result)
运行后输出结果如下(你示例中B的location写为col1,col2属于笔误,实际原数据中B出现在col1和col3):
Name location 0 B col1,col3 1 E col1 2 C col2 3 D col2 4 F col2 5 A col3 6 G col3
如果需要调整为你示例中的排序规则,额外加一行排序逻辑即可:
result = result.sort_values('location').reset_index(drop=True)
逻辑说明
melt方法将原DataFrame的列名转为location列的取值,原单元格的取值转为Name列,直接生成「列名-单元格值」的映射长表- 按
Name分组后对location列执行逗号拼接,即可得到每个值所有出现过的列的汇总结果
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

