将以Timestamp为索引的DataFrames转换为三元组存储格式
解决方法:用Pandas将多宽表转为统一长格式
这需求用Pandas的melt函数就能完美搞定,它专门用来把宽格式的DataFrame转成你要的长格式,再配合concat合并多个处理后的表就行,具体步骤如下:
1. 先准备示例数据(模拟你的场景)
首先我们复现你给出的两个DataFrame,注意把timestamp转成datetime类型方便后续排序:
import pandas as pd # 第一个DataFrame(含tag、celc列) df1 = pd.DataFrame({ 'timestamp': ['2018-03-15 20:05:01.080', '2018-03-15 20:05:23.630', '2018-03-15 20:12:16.990'], 'tag': [1, 1, 1], 'celc': [52, 52, 53] }) df1['timestamp'] = pd.to_datetime(df1['timestamp']) # 第二个DataFrame(含bpm列) df2 = pd.DataFrame({ 'timestamp': ['2018-03-15 20:05:01', '2018-03-15 20:21:41', '2018-03-15 20:38:21'], 'bpm': [50.00, 74.00, 65.33] }) df2['timestamp'] = pd.to_datetime(df2['timestamp'])
2. 单个DataFrame转长格式
用melt函数把每个宽表转成timestamp+label+value的结构:
id_vars='timestamp':指定保留timestamp作为标识列var_name='label':把原来的列名(比如tag、celc、bpm)转成label列的值value_name='value':把原来列对应的值转成value列的值
# 处理第一个DataFrame melted_df1 = df1.melt(id_vars='timestamp', var_name='label', value_name='value') # 处理第二个DataFrame melted_df2 = df2.melt(id_vars='timestamp', var_name='label', value_name='value')
3. 合并并排序所有结果
把处理后的多个长表合并,再按timestamp排序,就得到你要的最终格式了:
# 合并所有处理后的表 final_df = pd.concat([melted_df1, melted_df2]) # 按timestamp排序,重置索引 final_df = final_df.sort_values('timestamp').reset_index(drop=True)
最终输出结果
运行后final_df的内容就是:
timestamp label value 0 2018-03-15 20:05:01.000 bpm 50.00 1 2018-03-15 20:05:01.080 tag 1.00 2 2018-03-15 20:05:01.080 celc 52.00 3 2018-03-15 20:05:23.630 tag 1.00 4 2018-03-15 20:05:23.630 celc 52.00 5 2018-03-15 20:12:16.990 tag 1.00 6 2018-03-15 20:12:16.990 celc 53.00 7 2018-03-15 20:21:41.000 bpm 74.00 8 2018-03-15 20:38:21.000 bpm 65.33
补充:如果你的DataFrame是以Timestamp为索引
如果你的原始DataFrame是把timestamp设为索引(而不是列),那只需要先把索引转成列再执行上面的步骤:
# 假设df1的索引是timestamp,先转成列 df1 = df1.reset_index(names='timestamp')
内容的提问来源于stack exchange,提问作者Giannis
相关产品推荐
相关产品推荐

