如何高效转换含时间序列的Pandas DataFrame格式?
高效实现Pandas时间序列数据的宽表转置
核心思路
用Pandas内置的向量化重塑操作(melt + pivot/pivot_table)替代交叉连接,避免数据量爆炸,10万级数据可实现秒级处理。
分步实现代码
假设你的原始DataFrame名为df,包含Customer、Item、Date以及00:00至23:30的时段列:
提取时段列并转成长格式
把横向的时段列转为纵向键值对,保留Customer、Item、Date作为标识列:import pandas as pd # 自动识别所有时段列(排除非时段列) time_cols = [col for col in df.columns if col not in ['Customer', 'Item', 'Date']] # 宽转长:将时段列拆分为Time(时段)和Value(对应数值) melted_df = df.melt( id_vars=['Customer', 'Item', 'Date'], value_vars=time_cols, var_name='Time', value_name='Value' )合并日期和时段为完整时间戳
将Date和Time拼接后转为datetime类型,作为行维度的时间索引:# 拼接日期+时段,转为时间戳 melted_df['Timestamp'] = pd.to_datetime( melted_df['Date'].astype(str) + ' ' + melted_df['Time'] ) # 删除冗余列,减少内存占用 melted_df = melted_df.drop(columns=['Date', 'Time'])将Item转为列(最终重塑)
用pivot或pivot_table把Item转成横向列,Customer和Timestamp作为行索引:# 无重复值时用pivot(速度更快) final_df = melted_df.pivot( index=['Customer', 'Timestamp'], columns='Item', values='Value' ).reset_index() # 若存在同一Customer+Timestamp+Item的重复数据,用pivot_table聚合 # final_df = melted_df.pivot_table( # index=['Customer', 'Timestamp'], # columns='Item', # values='Value', # aggfunc='sum', # 可替换为'mean'等,根据业务需求 # fill_value=0 # ).reset_index() # 填充缺失值(如无对应Item的数据填0) final_df = final_df.fillna(0)
为什么比交叉连接高效?
交叉连接会生成原行数 × 时段数 × Item数的笛卡尔积,数据量瞬间膨胀到百万甚至千万级;而melt仅生成原行数 × 时段数的中间数据,后续pivot是聚合操作,不会额外放大数据量,全程都是Pandas优化的向量化运算,性能提升几个数量级。
内容的提问来源于stack exchange,提问作者NeverSayEver
相关产品推荐
相关产品推荐

