如何合并Pandas两列并保留原列名作为新列?
解决方法
你的需求是把原DataFrame的V1、V2列转换为“值+来源列名”的长表结构,combine_first确实不适用——它的作用是用另一列的非空值填充当前列的NaN,不是做列转行的结构转换。这里给你两种简单的实现方式:
方法1:使用stack()(推荐)
stack()会自动忽略NaN值,直接把非空的列名和对应值堆叠起来,步骤如下:
import pandas as pd import numpy as np # 构造原数据 df = pd.DataFrame({ 'V1': [10.0, np.nan, 5.0, np.nan], 'V2': [np.nan, 15.0, np.nan, 10.0] }) # 处理数据 result = df.stack().reset_index() # 重命名列 result.columns = ['原索引', 'column_name', 'V'] # 去掉原索引列,调整列顺序 result = result.drop('原索引', axis=1)[['V', 'column_name']]
运行后得到的result就是你要的结果:
V column_name 0 10.0 V1 1 15.0 V2 2 5.0 V1 3 10.0 V2
方法2:使用melt()+dropna()
先把宽表转成包含所有列名和值的长表,再过滤掉空值:
result = df.melt(var_name='column_name', value_name='V').dropna() # 重置索引(避免dropna后索引不连续) result = result.reset_index(drop=True)
这个方法同样能得到目标结果,适合更通用的宽转长场景。
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

