如何在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结构示例:
| Year | Product | Quantity | Cost |
|---|---|---|---|
| 2021 | A | 200 | 7000 |
| 2021 | B | 500 | 9000 |
| 2021 | C | 450 | 1100 |
| 2022 | A | 300 | 4000 |
| ... | ... | ... | ... |
方法二:使用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
相关产品推荐
相关产品推荐

