通过拆分列名实现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
相关产品推荐
相关产品推荐

