You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:13:22