如何将含站点列的宽格式Pandas DataFrame转换为长格式?
Pandas 宽格式DataFrame转长格式(站点需求数据重塑)
你的需求是典型的宽格式转长格式操作,其实melt就是最适合的工具,可能是之前用法有误。以下是两种Pandas内置的实现方式:
方法1:使用melt函数
先构造你的原始DataFrame:
import pandas as pd # 原始宽格式数据 df = pd.DataFrame({ 'station 1': [0.1, -0.04], 'station 2': [1.2, 0.9] })
通过melt直接转换,指定行索引作为标识变量,同时设置新列的名称:
# 转换为长格式 df_long = df.reset_index().melt( id_vars='index', # 保留原行索引作为标识 var_name='station', # 原列名转为新列"station" value_name='demand' # 原数值转为新列"demand" ).reset_index(drop=True) # 重置结果的索引
执行后得到的df_long结构如下(与你的目标表一致):
index station demand 0 0 station 1 0.10 1 1 station 1 -0.04 2 0 station 2 1.20 3 1 station 2 0.90
如果需要严格按站点分组排序,可追加sort_values:
df_long = df.reset_index().melt( id_vars='index', var_name='station', value_name='demand' ).sort_values('station').reset_index(drop=True)
方法2:使用stack函数
stack通过将列标签转为行索引层级来实现重塑,再展开为普通列:
# 转换为长格式 df_long = df.stack().reset_index() # 重命名列名匹配需求 df_long.columns = ['index', 'station', 'demand'] # 重置结果索引 df_long = df_long.reset_index(drop=True)
该方法同样能得到符合要求的结果。
注:你给出的目标表中第二行需求值为
-0.4,应为原数据-0.04的笔误,上述代码会保留原始数据的准确值。
内容的提问来源于stack exchange,提问作者Killian Wood
相关产品推荐
相关产品推荐

