如何基于CANDIDATE_ID列在Pandas中将多列转换为行
Pandas宽表转长表实现方案
场景说明
现有如下宽格式DataFrame:
| CANDIDATE_ID | jid 1 | type1 | score1 | jid 2 | type2 | score2 |
|---|---|---|---|---|---|---|
| 12 | 1 | A | 100 | 3 | C | 300 |
| 13 | 2 | B | 200 | 4 | D | 400 |
需要转换为长格式:
| CANDIDATE_ID | jid | type | score |
|---|---|---|---|
| 12 | 1 | A | 100 |
| 12 | 3 | C | 300 |
| 13 | 2 | B | 200 |
| 13 | 4 | D | 400 |
实现方法
方法一:使用pd.wide_to_long(推荐,扩展性强)
该方法专门处理带编号后缀的宽表,适合后续可能新增更多组(如jid 3、type3)的场景:
import pandas as pd # 构建测试数据 df = pd.DataFrame({ 'CANDIDATE_ID': [12, 13], 'jid 1': [1, 2], 'type1': ['A', 'B'], 'score1': [100, 200], 'jid 2': [3, 4], 'type2': ['C', 'D'], 'score2': [300, 400] }) # 执行转换 result = pd.wide_to_long( df, stubnames=['jid ', 'type', 'score'], # 列名前缀,注意`jid `带空格 i='CANDIDATE_ID', # 保留的主键列 j='group', # 临时生成的分组编号列 sep='' # 前缀与编号的分隔符,这里无明显分隔符,设为空 ).reset_index() # 调整列名和结构 result = result.rename(columns={'jid ': 'jid'}) \ .drop('group', axis=1) \ [['CANDIDATE_ID', 'jid', 'type', 'score']]
方法二:拆分合并(简单直观,适合少组数场景)
如果只有两组数据,直接拆分后合并更易懂:
import pandas as pd # 构建测试数据 df = pd.DataFrame({ 'CANDIDATE_ID': [12, 13], 'jid 1': [1, 2], 'type1': ['A', 'B'], 'score1': [100, 200], 'jid 2': [3, 4], 'type2': ['C', 'D'], 'score2': [300, 400] }) # 拆分两组数据并统一列名 df_group1 = df[['CANDIDATE_ID', 'jid 1', 'type1', 'score1']].rename( columns={'jid 1': 'jid', 'type1': 'type', 'score1': 'score'} ) df_group2 = df[['CANDIDATE_ID', 'jid 2', 'type2', 'score2']].rename( columns={'jid 2': 'jid', 'type2': 'type', 'score2': 'score'} ) # 合并结果 result = pd.concat([df_group1, df_group2], ignore_index=True)
结果验证
执行上述代码后,result即为目标格式的DataFrame:
CANDIDATE_ID jid type score 0 12 1 A 100 1 12 3 C 300 2 13 2 B 200 3 13 4 D 400
内容的提问来源于stack exchange,提问作者Vishal Bapat
相关产品推荐
相关产品推荐

