如何将类透视表结构的DataFrame重塑为指定长表格式?
如何将透视表结构的DataFrame重塑为长表格式?
问题背景
我有一个类似透视表结构的DataFrame:
| A | B | 2022年12月 | 2023年1月 |
|---|---|---|---|
| A1 | B1 | 100 | 200 |
| A1 | B2 | 101 | 201 |
想要将其转换为以下长表格式:
| 月份(Month) | A | B | 数值(Value) |
|---|---|---|---|
| 2022年12月 | A1 | B1 | 100 |
| 2022年12月 | A1 | B2 | 101 |
| 2023年1月 | A1 | B1 | 200 |
| 2023年1月 | A1 | B2 | 201 |
尝试使用df.T转置后结果不符合预期,得到的是行列互换的结构,并非目标格式。
解决方案
使用Pandas的melt()方法实现宽表转长表,这是处理这类结构转换的标准方法,代码示例如下:
import pandas as pd # 构造原始DataFrame(如果已有则跳过) df = pd.DataFrame({ 'A': ['A1', 'A1'], 'B': ['B1', 'B2'], '2022年12月': [100, 101], '2023年1月': [200, 201] }) # 执行重塑 result_df = df.melt( id_vars=['A', 'B'], # 保留作为标识的列,不参与融化 var_name='月份(Month)', # 原列名转为新列的名称 value_name='数值(Value)' # 原单元格值转为新列的名称 ) # 可选:按月份排序,匹配目标格式的顺序 result_df = result_df.sort_values('月份(Month)').reset_index(drop=True)
参数说明
id_vars:指定不需要被转换的列,也就是需要保留的分组标识列(这里是A和B)。var_name:定义从原列名衍生出的新列的名称,对应目标中的“月份(Month)”。value_name:定义从原单元格值衍生出的新列的名称,对应目标中的“数值(Value)”。
执行上述代码后,即可得到完全符合需求的DataFrame结构。
内容的提问来源于stack exchange,提问作者redwytnblakII
相关产品推荐
相关产品推荐

