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

如何在Python Pandas中对DataFrame多变量执行Unpivot(逆透视)

宽格式DataFrame转长格式(拆分数量与成本列)

针对你给出的DataFrame结构,要将产品数量和对应的成本拆分为独立列,同时以年份和产品名为标识转为长格式,可以用以下两种高效方法:

方法一:使用pd.wide_to_long(推荐,适配列名规律)

该方法专门处理带有固定前缀/后缀的宽格式数据,你的列名刚好符合[产品名](数量)和[产品名] cost(成本)的规律,非常适合用这个函数:

import pandas as pd

# 补全年份实际值(示例用2021-2023)
year1, year2, year3 = '2021', '2022', '2023'
df = pd.DataFrame({
    'Year': [year1, year2, year3],                                                                       
    'A': [200,300,400],
    'B': [500,600,300],
    'C': [450,369,235],
    'A cost': [7000, 4000, 7000 ],
    'B cost': [9000, 4000, 6000],
    'C cost': [1100, 4300, 2320],
})

# 执行逆透视转换
df_long = pd.wide_to_long(
    df,
    stubnames=['', 'cost'],  # 对应无后缀的数量列、带cost后缀的成本列
    i='Year',  # 保留的索引列(年份)
    j='Product',  # 拆分出的产品名列
    sep=' ',  # 产品名和cost之间的分隔符
    suffix='.*'
)

# 重命名列并重置索引为普通列
df_long = df_long.rename(columns={'': 'Quantity', 'cost': 'Cost'}).reset_index()

转换后的长格式DataFrame结构示例:

YearProductQuantityCost
2021A2007000
2021B5009000
2021C4501100
2022A3004000
............

方法二:使用pd.melt分两次处理后合并

如果需要更灵活的处理逻辑,可以分别对数量列和成本列执行melt,再合并结果:

# 提取产品数量数据
df_quantity = df.melt(
    id_vars='Year',
    value_vars=['A', 'B', 'C'],
    var_name='Product',
    value_name='Quantity'
)

# 提取产品成本数据并清理产品名
df_cost = df.melt(
    id_vars='Year',
    value_vars=['A cost', 'B cost', 'C cost'],
    var_name='Product',
    value_name='Cost'
)
df_cost['Product'] = df_cost['Product'].str.replace(' cost', '')

# 按年份和产品名合并两个数据集
df_long = pd.merge(df_quantity, df_cost, on=['Year', 'Product'])

两种方法最终得到的结果完全一致,可根据你的实际数据规模和列名复杂度选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:48:14