如何合并DataFrame两列并生成标记列区分数据来源
问题描述
我有如下DataFrame:
id p means temp 0 1 p1 means11 t11 1 1 p1 means12 t12 2 1 p1 means13 t13 3 2 p2 means21 t21 4 2 p2 means22 t22 5 2 p2 means23 t23
需要将means列与temp列合并为一列(仍命名为means),同时新增eval列:元素来自原means列时标记为True,来自原temp列时标记为False,最终得到如下结构的DataFrame:
id p means eval 0 1 p1 means11 True 1 1 p1 means12 True 2 1 p1 means13 True 3 1 p1 t11 False 4 1 p1 t12 False 5 1 p1 t13 False 6 2 p2 means21 True 7 2 p2 means22 True 8 2 p2 means23 True 9 2 p2 t21 False 10 2 p2 t22 False 11 2 p2 t23 False
解决方案
这里提供两种实现方式:
方法一:使用melt函数(高效简洁)
melt是Pandas中用于宽表转窄表的函数,适合快速合并多列:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'id': [1,1,1,2,2,2], 'p': ['p1','p1','p1','p2','p2','p2'], 'means': ['means11','means12','means13','means21','means22','means23'], 'temp': ['t11','t12','t13','t21','t22','t23'] }) # 重塑数据,合并means和temp列 result = df.melt( id_vars=['id', 'p'], value_vars=['means', 'temp'], value_name='means' ) # 生成eval列,标记数据来源 result['eval'] = result['variable'] == 'means' # 清理临时列并排序 result = result.drop('variable', axis=1).sort_values(by=['id', 'p', 'eval'], ascending=[True, True, False]).reset_index(drop=True) print(result)
方法二:分表拼接(直观易懂)
分别处理两列后再合并,适合理解基础操作的场景:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'id': [1,1,1,2,2,2], 'p': ['p1','p1','p1','p2','p2','p2'], 'means': ['means11','means12','means13','means21','means22','means23'], 'temp': ['t11','t12','t13','t21','t22','t23'] }) # 处理means列,添加eval=True df_means = df[['id', 'p', 'means']].copy() df_means['eval'] = True # 处理temp列,重命名为means,添加eval=False df_temp = df[['id', 'p', 'temp']].rename(columns={'temp': 'means'}) df_temp['eval'] = False # 合并两个表并排序 result = pd.concat([df_means, df_temp]).sort_values(by=['id', 'p', 'eval'], ascending=[True, True, False]).reset_index(drop=True) print(result)
两种方法最终都会得到目标结构的DataFrame,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者zahra elhamraoui
相关产品推荐
相关产品推荐

