将数据帧转换为三重存储

时间:2018-03-22 19:49:09

标签: python pandas

我有一堆数据帧,全部由timestamp(datetime)索引。 每个列都有几列,通常带有数值。

timestamp tag celc
2018-03-15 20:05:01.080 1 52
2018-03-15 20:05:23.630 1 52
2018-03-15 20:12:16.990 1 53


timestamp   bpm
2018-03-15 20:05:01 50.00
2018-03-15 20:21:41 74.00
2018-03-15 20:38:21 65.33

我要做的是将它们转换为以下格式

timestamp label value
2018-03-15 20:05:01.000 bpm 50.00
2018-03-15 20:05:01.080 tag 1
2018-03-15 20:05:01.080 celc 52
2018-03-15 20:05:23.630 tag 1
2018-03-15 20:05:23.630 celc 52
2018-03-15 20:12:16.990 tag 1
2018-03-15 20:12:16.990 celc 53
2018-03-15 20:21:41.000 bpm 74.00
2018-03-15 20:38:21.000 bpm 65.33

我目前在组合表格上使用.stack()

pd.concat(dataframes, axis=1).sort_index().stack() 

这会产生预期的结果。

  

我想知道这是否是“正确”,最有效的方法,   或者我是否应该这样做。

当输出不同的格式时,需要连接表,如果可以改进该功能,我也想知道。

1 个答案:

答案 0 :(得分:2)

首先使用( 'Crime & Punishment', 'Goodnight Moon', 'The Singularity', 'One Fish Two Fish' ) 取消对数据帧的取消,并将数据帧连接起来

数据准备

( 'Narnia' )

连接数据帧

DataFrame.melt

结果

import pandas as pd
from io import StringIO

raw_data = ('''timestamp,tag,celc
2018-03-15 20:05:01.080,1,52
2018-03-15 20:05:23.630,1,52
2018-03-15 20:12:16.990,1,53''',
'''timestamp,bpm
2018-03-15 20:05:01,50.00
2018-03-15 20:21:41,74.00
2018-03-15 20:38:21,65.33''')

dataframes = [
    pd.read_csv(StringIO(x)).assign(timestamp = lambda df:pd.to_datetime(df.timestamp)) 
    for x in raw_data
]
连接前的

DataFrames

pd.concat([df.melt('timestamp') for df in dataframes]).set_index('timestamp').sort_index()