将列表值设置为DataDrama中的列

时间:2017-12-31 11:14:33

标签: list dataframe concat

所以我绊倒了这个问题,几个小时都找不到解决方案。基本上我有以下两个列表,我希望将其转换为我的最终解决方案:数据框,其中日期为索引,每个工具为列,其中包含该列中的相应值。

在我的第一个列表中,我有以下结构:

[  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 ...       

如果有人能在这里提供帮助,我们会很高兴。

祝你新年快乐!

1 个答案:

答案 0 :(得分:1)

如果您的两个列表是l1l2,并且元素是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

ki -

结合使用
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