如何在Pandas中按axis=0合并两列并保留对应test列数据
合并Pandas列并保留对应test列数据
原始数据
import pandas as pd import numpy as np d_test = { 'c1' : ['a', 'b', np.nan, 'c'], 'c2' : ['d', np.nan, 'e', 'f'], 'test': [1,2,3,4], } df_test = pd.DataFrame(d_test)
需求说明
需要将c1和c2两列按行方向(axis=0)合并为一列,同时保留每行对应的test列数据,最终得到如下结果:
combined test 0 a 1 1 d 1 2 b 2 3 e 3 4 c 4 5 f 4
问题场景
已尝试使用pd.concat([df_test.c1 , df_test.c2], axis = 0)合并列,但无法同时保留对应的test列数据。
解决方案
方法1:使用melt函数(推荐)
melt是Pandas中专门用于宽表转长表的函数,可直接指定需要保留的列和需要合并的列:
# 转换宽表为长表,保留test列,合并c1、c2 result = df_test.melt( id_vars=['test'], # 要保留的关联列 value_vars=['c1', 'c2'], # 需要合并的目标列 value_name='combined' # 合并后的列名 ) # 过滤空值、调整顺序并重置索引 result = result.dropna(subset=['combined']).sort_values('test').reset_index(drop=True) # 调整列顺序匹配目标格式 result = result[['combined', 'test']] print(result)
方法2:拆分后再合并
分别将c1、c2与test列组合成新的DataFrame,再进行合并:
# 构造c1+test和c2+test的DataFrame,统一列名 df_c1 = df_test[['c1', 'test']].rename(columns={'c1': 'combined'}) df_c2 = df_test[['c2', 'test']].rename(columns={'c2': 'combined'}) # 合并两个DataFrame,过滤空值并整理 result = pd.concat([df_c1, df_c2], axis=0) result = result.dropna(subset=['combined']).sort_values('test').reset_index(drop=True) print(result)
内容的提问来源于stack exchange,提问作者illuminato
相关产品推荐
相关产品推荐

