如何用Pandas实现列转行并保留数据值(含时间维度转换)
解决Pandas表格结构转换问题
步骤拆解
要实现目标结构,核心是先宽表转长表拆分小时列,再长表转宽表将Variable转为列名,具体分四步:
- 拆分小时列:用
melt把H01-H24的宽格式转为长格式,保留date、Variable、station_code作为标识列,把小时列名和对应值拆成两列。 - 生成datetime列:从小时列名中提取小时数,和
date组合成完整的datetime格式。 - 重塑表格结构:用
pivot将Variable的取值转为列名,对应填充小时值,同时保留station_code。 - 整理最终结构:重置索引,让datetime和station_code回到列的位置。
代码实现
假设原始DataFrame名为df,具体代码如下:
import pandas as pd # 1. 宽表转长表,拆分小时列 melted_df = df.melt( id_vars=['date', 'Variable', 'station_code'], value_vars=[f'H{i:02d}' for i in range(1, 25)], # 自动生成H01到H24列名 var_name='hour_label', value_name='variable_value' ) # 2. 提取小时数并生成datetime列 melted_df['hour'] = melted_df['hour_label'].str.extract(r'(\d+)').astype(int) melted_df['datetime'] = pd.to_datetime(melted_df['date']) + pd.to_timedelta(melted_df['hour'], unit='h') # 3. 长表转宽表,将Variable转为列名 pivoted_df = melted_df.pivot( index=['datetime', 'station_code'], columns='Variable', values='variable_value' ).reset_index() # 清理列名层级(可选操作) pivoted_df.columns.name = None
关键细节说明
melt的value_vars用列表推导式生成列名,避免手动输入所有H01-H24。- 用正则
(\d+)提取小时数,确保从H01到H24都能正确获取1-24的整数。 - 生成datetime时,先将
date转为datetime类型再加小时差,比字符串拼接更稳定。 - 若存在同一
datetime+station_code+Variable的重复值,建议替换为pivot_table并指定aggfunc(如aggfunc='mean')做聚合处理。
内容的提问来源于stack exchange,提问作者JuMoGar
相关产品推荐
相关产品推荐

