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

如何用Pandas实现适配新增月份列的透视表转换?

问题与解决方案

问题描述

现有如下DataFrame(df):

class teacher January February
0     A    Mary       4        3
1     B     Ann       5        7
2     C   Kevin       6        8

生成该DataFrame的代码:

import pandas as pd
df = pd.DataFrame( {'class':['A', 'B', 'C'], 
                    'teacher':['Mary', 'Ann', 'Kevin'],
                    'January':['4', '5', '6'], 
                    'February':['3', '7', '8']
                   } )

需要将其中的月份列转换为行,得到如下结构的new_df:

month     class teacher count
0   January      A    Mary      4     
1   January      B    Ann       5        
2   January      C    Kevin     6        
3   February     A    Mary      3     
4   February     B    Ann       7        
5   February     C    Kevin     8       

未来该DataFrame可能会新增月份列(如March),需要实现可适配所有月份列的转换。请问如何通过pivot相关操作完成转换?是否需要先进行行列互换?

解决方案

你需要的是**逆透视(Unpivot)**操作,而非常规的pivot(透视,用于行转列),不需要先进行行列互换,直接使用pandas的melt()方法即可实现,且能自动适配新增的月份列。

实现代码

import pandas as pd

# 生成原始DataFrame
df = pd.DataFrame( {'class':['A', 'B', 'C'], 
                    'teacher':['Mary', 'Ann', 'Kevin'],
                    'January':['4', '5', '6'], 
                    'February':['3', '7', '8']
                   } )

# 执行逆透视转换
new_df = df.melt(
    id_vars=['class', 'teacher'],  # 指定保持不变的列
    var_name='month',              # 原月份列的列名会作为该列的取值
    value_name='count'             # 原月份列的数值会存入该列
).astype({'count': int})  # 可选:将count列从字符串转为整数类型

print(new_df)

关键说明

  • id_vars:指定转换过程中保持结构不变的列(这里是class和teacher),其余所有列都会被自动识别为需要转换的月份列。
  • 当后续新增March等月份列时,无需修改代码,melt()会自动将新增的月份列纳入转换范围,完全适配动态新增的列。
  • astype({'count': int})是可选步骤,因为原始DataFrame中月份列的数值是以字符串形式存储的,转换为整数能让数据类型更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:07:15