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

通过拆分列名实现DataFrame的逆透视(Unpivot)

解决方案

可以通过拆分列名+重塑数据的方式实现需求,具体步骤如下:

1. 准备示例数据

import pandas as pd

df = pd.DataFrame({
    'volume_brand1': [1000],
    'volume_productX_brand1': [100],
    'amount_brand1': [10],
    'amount_productX_brand1': [50],
    'volume_productX_brand2': [2000],
    'amount_productX_brand2': [200]
})

2. 逆透视所有列

先把所有列转为「变量-值」对,因为没有固定的标识列,直接使用melt且不指定id_vars:

melted = df.melt(var_name='col_name', value_name='value')

3. 拆分列名提取关键信息

利用正则表达式从列名中拆分出brand、product、metric(volume/amount)三个字段:

# 提取度量指标(volume/amount)
melted['metric'] = melted['col_name'].str.extract(r'(volume|amount)')
# 提取产品名称,非productX的填充为"not product X"
melted['product'] = melted['col_name'].str.extract(r'_(productX)_').fillna('not product X')
# 提取品牌名称
melted['brand'] = melted['col_name'].str.extract(r'(brand\d+)')

4. 重塑为目标格式

通过pivot将度量指标转为列,再整理结果:

# 透视数据,将metric转为列
result = melted.pivot(index=['brand', 'product'], columns='metric', values='value').reset_index()
# 移除列名层级,调整列顺序
result.columns.name = None
result = result[['brand', 'product', 'volume', 'amount']]

# 可选:调整行顺序,和目标示例一致
result = result.sort_values(['brand', 'product'], ascending=[True, False]).reset_index(drop=True)

最终输出结果:

brand          product  volume  amount
0  brand1         productX     100      50
1  brand1  not product X      1000      10
2  brand2         productX    2000     200

内容的提问来源于stack exchange,提问作者borisvanax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:00:06