所以我绊倒了这个问题,几个小时都找不到解决方案。基本上我有以下两个列表,我希望将其转换为我的最终解决方案:数据框,其中日期为索引,每个工具为列,其中包含该列中的相应值。
在我的第一个列表中,我有以下结构:
[ Instrument Date
0 IWVL.L 2017-12-29T00:00:00Z
1 IWVL.L 2017-12-28T00:00:00Z
2 IWVL.L 2017-12-27T00:00:00Z
3 IWVL.L 2017-12-22T00:00:00Z
4 IWVL.L 2017-12-21T00:00:00Z
5 IWVL.L 2017-12-20T00:00:00Z, Instrument Date
0 IWMO.L 2017-12-29T00:00:00Z
1 IWMO.L 2017-12-28T00:00:00Z
2 IWMO.L 2017-12-27T00:00:00Z
3 IWMO.L 2017-12-22T00:00:00Z
4 IWMO.L 2017-12-21T00:00:00Z
5 IWMO.L 2017-12-20T00:00:00Z,
等等(总共100个条目)。
我的第二个列表具有以下结构:
[ Instrument Total Return
0 IWVL.L 0.405743
1 IWVL.L -0.031201
2 IWVL.L 0.046824
3 IWVL.L -0.140274
4 IWVL.L 0.375469
5 IWVL.L 0.156691, Instrument Total Return
0 IWMO.L 0.294196
1 IWMO.L 0.080300
2 IWMO.L -0.080235
3 IWMO.L -0.213504
4 IWMO.L 0.321285
5 IWMO.L -0.120337,
现在我想要一个结构,它将日期作为索引,将Instruments作为单独的列(第一列:IWVL.K,第二列:IWMO.L等)。然后,对于特定日期,总回报的值将按列列出。它看起来像这样(前两个乐器的片段):
IWVL.L IWMO.L ...
Date
2017-12-29 0.405743 0.294196 ...
2017-12-28 -0.031201 0.080300 ...
2017-12-27 0.046824 -0.080235 ...
如果有人能在这里帮忙,我会很高兴的。
哦,祝新年快乐!
如果你的两个列表是l1
和l2
,并且如果元素是1-1对应的,那么使用concat
和随后的pivot
操作简化你的解决方案。
i = pd.concat(l1, ignore_index=True)
j = pd.concat(l2, ignore_index=True)
df = pd.concat([i, j[['Total Return']]], axis=1)\
.pivot('Date', 'Instrument', 'Total Return')
df
Instrument IWMO.L IWVL.L
Date
2017-12-20T00:00:00Z -0.120337 0.156691
2017-12-21T00:00:00Z 0.321285 0.375469
2017-12-22T00:00:00Z -0.213504 -0.140274
2017-12-27T00:00:00Z -0.080235 0.046824
2017-12-28T00:00:00Z 0.080300 -0.031201
2017-12-29T00:00:00Z 0.294196 0.405743
细节
首先,我们连接每个列表中的每个数据帧 -
i = pd.concat(l1, ignore_index=True)
i.head()
Instrument Date
0 IWVL.L 2017-12-29T00:00:00Z
1 IWVL.L 2017-12-28T00:00:00Z
2 IWVL.L 2017-12-27T00:00:00Z
3 IWVL.L 2017-12-22T00:00:00Z
4 IWVL.L 2017-12-21T00:00:00Z
j = pd.concat(l2, ignore_index=True)
j.head()
Instrument Total Return
0 IWVL.L 0.405743
1 IWVL.L -0.031201
2 IWVL.L 0.046824
3 IWVL.L -0.140274
4 IWVL.L 0.375469
现在,由于每个条目都直接对应,只需将它们水平连接即可。我们只想要第二个的'Total Return'
列,因此相应地切出一个数据帧列 -
k = j[['Total Return']]
k.head()
Total Return
0 0.405743
1 -0.031201
2 0.046824
3 -0.140274
4 0.375469
将k
与i
结合 -
v = pd.concat([i, k], axis=1)
Instrument Date Total Return
0 IWVL.L 2017-12-29T00:00:00Z 0.405743
1 IWVL.L 2017-12-28T00:00:00Z -0.031201
2 IWVL.L 2017-12-27T00:00:00Z 0.046824
3 IWVL.L 2017-12-22T00:00:00Z -0.140274
4 IWVL.L 2017-12-21T00:00:00Z 0.375469
5 IWVL.L 2017-12-20T00:00:00Z 0.156691
6 IWMO.L 2017-12-29T00:00:00Z 0.294196
7 IWMO.L 2017-12-28T00:00:00Z 0.080300
8 IWMO.L 2017-12-27T00:00:00Z -0.080235
9 IWMO.L 2017-12-22T00:00:00Z -0.213504
10 IWMO.L 2017-12-21T00:00:00Z 0.321285
11 IWMO.L 2017-12-20T00:00:00Z -0.120337
现在,最后一步是“枢轴”操作。如何知道转轴?这只是重塑数据的一个奇特名称。您希望一列成为结果中的索引,另一列成为结果中的列,最后一列成为值。这是对旋转操作的描述(与SQL数据库习惯用法非常相似)。
v.pivot(index='Date', columns='Instrument', values='Total Return')
Instrument IWMO.L IWVL.L
Date
2017-12-20T00:00:00Z -0.120337 0.156691
2017-12-21T00:00:00Z 0.321285 0.375469
2017-12-22T00:00:00Z -0.213504 -0.140274
2017-12-27T00:00:00Z -0.080235 0.046824
2017-12-28T00:00:00Z 0.080300 -0.031201
2017-12-29T00:00:00Z 0.294196 0.405743
更多信息可以在这里找到 - How to pivot a dataframe。