所以我绊倒了这个问题,几个小时都找不到解决方案。基本上我有以下两个列表,我希望将其转换为我的最终解决方案:数据框,其中日期为索引,每个工具为列,其中包含该列中的相应值。
在我的第一个列表中,我有以下结构:
[ 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 ...
如果有人能在这里提供帮助,我们会很高兴。
祝你新年快乐!
答案 0 :(得分:1)
如果您的两个列表是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。