如何将宽格式Pandas DataFrame转换为长格式(表格形式)?
解决宽格式DataFrame转长格式的问题
嘿,我明白你现在的困惑——宽转长确实是pivot的反向操作,在pandas里我们用melt()函数就能轻松搞定!先给你提个小细节:你给出的示例DataFrame里有重复的列名'1/1/2001',创建DataFrame时后面的列会覆盖前面的,我先帮你修正这个问题,再一步步演示转换步骤。
第一步:修正示例DataFrame
先把重复的日期列名调整一下,避免数据丢失:
import pandas as pd # 修正重复列名,把第二个'1/1/2001'改成'1/1/2001_2' PPPP = pd.DataFrame({ '1/1/2001_1': [5,6,7,8,9], '1/1/2001_2':[45,46,47,48,49], '1/2/2001':[15,16,17,18,19], '1/3/2001':[25,26,27,28,29], 'Category1':['aa','bb','cc','dd','ee'], 'Category2':['XX','YY','ZZ','FF','KK'] })
第二步:用pd.melt()实现宽转长
melt()的核心是指定需要保留的标识列(不参与转换的列)和需要转成行的列:
# 转换为长格式 long_df = pd.melt( PPPP, id_vars=['Category1', 'Category2'], # 这两列保持原样,作为每行的标识 var_name='Date', # 原来的日期列名会变成这个新列的内容 value_name='Value' # 原来日期列对应的值会放到这个新列里 )
转换后的长格式结果
运行上面的代码后,long_df的结构会是这样:
Category1 Category2 Date Value 0 aa XX 1/1/2001_1 5 1 bb YY 1/1/2001_1 6 2 cc ZZ 1/1/2001_1 7 3 dd FF 1/1/2001_1 8 4 ee KK 1/1/2001_1 9 5 aa XX 1/1/2001_2 45 6 bb YY 1/1/2001_2 46 ...(后续行以此类推)
如果你的原始数据里日期列没有重复,只需要把id_vars和日期列对应调整就行,melt()是处理宽转长最常用的工具,完全对应你要的pivot反向操作~
内容的提问来源于stack exchange,提问作者inatos
相关产品推荐
相关产品推荐

