我正在从长格式的固定SQL架构中检索数据,并希望将其转换为宽格式。
作为复杂功能,DataFrame中的每一行代表一天产品的值。值存储在表示一天中特定小时的列中。以下示例显示了六小时的间隔长度。这意味着我们每天在00:00,06:00,12:00和18:00存储四个值.DataFrame如下所示:
id date 0000 0600 1200 1800
0 APPL 01.01.2014 12 15 17 19
1 APPL 02.01.2014 21 23 25 27
2 MSFT 01.01.2014 1 2 3 4
3 MSFT 02.01.2014 5 6 7 8
我希望以宽格式实现的DataFrame是:
APPL MSFT
2014-01-01 00:00:00 12 1
2014-01-01 06:00:00 15 2
2014-01-01 12:00:00 17 3
2014-01-01 18:00:00 19 4
2014-01-02 00:00:00 21 5
2014-01-02 06:00:00 23 6
2014-01-02 12:00:00 25 7
2014-01-02 18:00:00 27 8
我尝试过各种pivot,un / stack和set_index组合来实现目标结构,但失败了。我最接近的是使用:
df = src.set_index(['date','id']).stack()
返回:
date id
01.01.2014 APPL 0000 12
0600 15
1200 17
1800 19
02.01.2014 APPL 0000 21
0600 23
1200 25
1800 27
01.01.2014 MSFT 0000 1
0600 2
1200 3
1800 4
02.01.2014 MSFT 0000 5
0600 6
1200 7
1800 8
但是我知道我无法解决MultiIndex。
非常感谢任何帮助。
答案 0 :(得分:3)
import pandas as pd
import io
text = """ id date 0000 0600 1200 1800
0 APPL 01.01.2014 12 15 17 19
1 APPL 02.01.2014 21 23 25 27
2 MSFT 01.01.2014 1 2 3 4
3 MSFT 02.01.2014 5 6 7 8"""
df = pd.read_csv(io.BytesIO(text), delim_whitespace=True)
df = df.set_index(["id", "date"]).stack().unstack(0)
def f(key):
date, hour = key
time = "{} {}:{}:00".format(date, hour[:2], hour[2:])
return pd.to_datetime(time, dayfirst=True)
df.index = df.index.map(f)
print df
输出:
id APPL MSFT
2014-01-01 00:00:00 12 1
2014-01-01 06:00:00 15 2
2014-01-01 12:00:00 17 3
2014-01-01 18:00:00 19 4
2014-01-02 00:00:00 21 5
2014-01-02 06:00:00 23 6
2014-01-02 12:00:00 25 7
2014-01-02 18:00:00 27 8