如何在Pandas中将指定列堆叠为新增行实现列转行
解决方案:Pandas列堆叠转换
原始数据与目标结构
原始DataFrame
| Type | a_PORT | a_BENCH | a_ACTIVE | b_PORT | b_BENCH |
|---|---|---|---|---|---|
| None | 20 | 25 | 18 | 30 | 50 |
目标DataFrame
| Type | PORT | BENCH | ACTIVE |
|---|---|---|---|
| a | 20 | 25 | 18 |
| b | 30 | 50 |
代码实现
方法一:多级列索引+转置重塑
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'Type': ['None'], 'a_PORT': [20], 'a_BENCH': [25], 'a_ACTIVE': [18], 'b_PORT': [30], 'b_BENCH': [50] }) # 移除无用的Type列 df = df.drop('Type', axis=1) # 拆分列名为(分组标识,指标类型)的多级索引 df.columns = df.columns.str.split('_', expand=True) # 转置后重置索引,再通过pivot重塑为目标结构 result = df.T.reset_index() result.columns = ['Type', 'value'] result = result.pivot(index='Type', columns='level_1', values='value').reset_index() # 清除列名的层级标签,空值替换为空字符串 result.columns.name = None result = result.fillna('') print(result)
方法二:melt拆分+ pivot重塑
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'Type': ['None'], 'a_PORT': [20], 'a_BENCH': [25], 'a_ACTIVE': [18], 'b_PORT': [30], 'b_BENCH': [50] }) # 移除无用Type列,将列转为行记录 df_melt = df.drop('Type', axis=1).melt(var_name='col', value_name='value') # 拆分列名得到分组标识和指标类型 df_melt[['Type', 'Category']] = df_melt['col'].str.split('_', expand=True) # 重塑为目标结构,处理空值 result = df_melt.pivot(index='Type', columns='Category', values='value').reset_index() result.columns.name = None result = result.fillna('') print(result)
关键步骤说明
- 清理无效列:原始
Type列值为None,无实际分组意义,直接移除。 - 拆分列名:通过下划线分隔列名,提取出分组标识(
a/b)和指标类型(PORT/BENCH/ACTIVE)。 - 重塑结构:利用转置+
pivot或melt+pivot的组合,将原横向的分组指标转为纵向的分组行记录,同时将指标类型转为列。 - 空值处理:用
fillna('')将缺失的ACTIVE值转为空字符串,匹配目标格式。
内容的提问来源于stack exchange,提问作者xc120
相关产品推荐
相关产品推荐

