如何用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
相关产品推荐
相关产品推荐

