Python中pandas.DataFrame的pivot、unpivot操作及宽长表转换方法
宽格式Pandas DataFrame转长格式实现方案
你可以通过pandas提供的两种逆透视操作实现需求,具体实现如下:
前置准备
首先你已经通过pivot生成了宽表,我们先将生成的宽表保存为变量wide_df:
import pandas as pd d = { 'year': [2019,2020,2021,2022], 'cat1': ['a','a','b','b'], 'cat2': ['c1','c2','c3','c4'],'value': [1,2,300,400]} df = pd.DataFrame(data=d) wide_df = df.pivot(index=['year','cat1'], columns='cat2', values='value').reset_index()
方法1:使用melt函数(可读性更高)
melt是pandas专门设计用于逆透视的函数,参数配置清晰易读:
long_df = wide_df.melt( id_vars=['year', 'cat1'], # 保留不需要转换的维度列 var_name='cat2', # 原c1/c2/c3/c4列名转换后对应的新列名 value_name='value' # 原数值转换后对应的新列名 ).dropna().reset_index(drop=True) # 去掉空值行、重置索引
方法2:使用stack方法(写法更简洁)
基于层级索引的stack方法可以更高效的完成转换,不需要额外配置太多参数:
long_df = wide_df.set_index(['year','cat1']).stack().reset_index(name='value')
输出结果
两种方法最终得到的long_df都和要求的输出一致:
year cat1 cat2 value 0 2019 a c1 1.0 1 2020 a c2 2.0 2 2021 b c3 300.0 3 2022 b c4 400.0
内容的提问来源于stack exchange,提问作者vishvas chauhan
相关产品推荐
相关产品推荐

