我已将数据导入数据框,如下所示
VMGI US Equity VMGI Open VMGI High VMGI Low VMGI Px_last VMGI Volume SPOM US Equity SPOM Open SPOM High SPOM Low SPOM Px_last SPOM Volume
Date
12/31/2012 12/31/2012 0.009 0.011 0.009 0.009 105726 12/31/2012 0.4575 0.4575 0.2925 0.3975 8890
1/1/2013 1/1/2013 0.009 0.011 0.009 0.009 105726 1/1/2013 0.4575 0.4575 0.2925 0.3975 8890
1/2/2013 1/2/2013 0.009 0.01 0.008 0.01 188150 1/2/2013 0.3975 0.3975 0.3225 0.3225 3400
1/3/2013 1/3/2013 0.011 0.018 0.011 0.015 169890 1/3/2013 0.34 0.3738 0.28 0.29 48933
1/4/2013 1/4/2013 0.015 0.018 0.014 0.018 33500 1/4/2013 0.36 0.4 0.3175 0.3175 3610
每个第6列都是新股票。行继续行1340行。我想在多索引(我认为)中重新组织以创建看起来像这样的数据,因为我想为每个股票添加额外的列。我能够使用以下代码获取股票名称
index2 =index1[0::6] >>> which results in an object as follows (the first column for each stock)
Index(['VMGI US Equity', 'SPOM US Equity', 'OPTL US Equity', 'FRHV US Equity', etc....
最终,我希望数据框看起来像每个股票的索引
VMGI US Equity VMGI US Equity VMGI Open VMGI High VMGI Low VMGI Px_last VMGI Volume
12/31/2012 0.009 0.011 0.009 0.009 105726
1/1/2013 0.009 0.011 0.009 0.009 105726
1/2/2013 0.009 0.01 0.008 0.01 188150
1/3/2013 0.011 0.018 0.011 0.015 169890
1/4/2013 0.015 0.018 0.014 0.018 33500
SPOM US Equity SPOM US Equity SPOM Open SPOM High SPOM Low SPOM Px_last SPOM Volume
12/31/2012 0.4575 0.4575 0.2925 0.3975 8890
1/1/2013 0.4575 0.4575 0.2925 0.3975 8890
我尝试了set_index并得到了以下错误。
df2.index = df_clean_penny1.set_index(index2)
ValueError: Length mismatch: Expected axis has 1340 elements, new values have 65 elements
从其他帖子我也尝试了MultiIndex.from_arrays()但也无法让它工作。任何帮助/指导表示赞赏
答案 0 :(得分:2)
您可以使用str
对象访问pd.Index
个对象,并使用pd.MultiIndex
和split
参数
expand=True
df.columns = df.columns.str.split(' ', 1, expand=True)
然后,您可以堆叠刚刚创建的列索引的第一级
df.stack(0)
High Low Open Px_last US Equity Volume
Date
12/31/2012 SPOM 0.4575 0.2925 0.4575 0.3975 12/31/2012 8890
VMGI 0.0110 0.0090 0.0090 0.0090 12/31/2012 105726
1/1/2013 SPOM 0.4575 0.2925 0.4575 0.3975 1/1/2013 8890
VMGI 0.0110 0.0090 0.0090 0.0090 1/1/2013 105726
1/2/2013 SPOM 0.3975 0.3225 0.3975 0.3225 1/2/2013 3400
VMGI 0.0100 0.0080 0.0090 0.0100 1/2/2013 188150
1/3/2013 SPOM 0.3738 0.2800 0.3400 0.2900 1/3/2013 48933
VMGI 0.0180 0.0110 0.0110 0.0150 1/3/2013 169890
1/4/2013 SPOM 0.4000 0.3175 0.3600 0.3175 1/4/2013 3610
VMGI 0.0180 0.0140 0.0150 0.0180 1/4/2013 33500
在不编辑columns
对象的情况下,此变体将使用set_axis
方法。从Pandas版本0.21开始,pd.DataFrame.set_axis
现在接受允许流水线操作的inplace=False
参数。
df.set_axis(df.columns.str.split(' ', 1, expand=True), 1, 0).stack(0)
High Low Open Px_last US Equity Volume
Date
12/31/2012 SPOM 0.4575 0.2925 0.4575 0.3975 12/31/2012 8890
VMGI 0.0110 0.0090 0.0090 0.0090 12/31/2012 105726
1/1/2013 SPOM 0.4575 0.2925 0.4575 0.3975 1/1/2013 8890
VMGI 0.0110 0.0090 0.0090 0.0090 1/1/2013 105726
1/2/2013 SPOM 0.3975 0.3225 0.3975 0.3225 1/2/2013 3400
VMGI 0.0100 0.0080 0.0090 0.0100 1/2/2013 188150
1/3/2013 SPOM 0.3738 0.2800 0.3400 0.2900 1/3/2013 48933
VMGI 0.0180 0.0110 0.0110 0.0150 1/3/2013 169890
1/4/2013 SPOM 0.4000 0.3175 0.3600 0.3175 1/4/2013 3610
VMGI 0.0180 0.0140 0.0150 0.0180 1/4/2013 33500
为了更进一步,我们可以交换索引的级别并进行排序以改善布局。
df.set_axis(df.columns.str.split(' ', 1, expand=True), 1, 0).stack(0) \
.swaplevel(0, 1).sort_index().reindex(df.index, level=1)
High Low Open Px_last US Equity Volume
Date
SPOM 12/31/2012 0.4575 0.2925 0.4575 0.3975 12/31/2012 8890
1/1/2013 0.4575 0.2925 0.4575 0.3975 1/1/2013 8890
1/2/2013 0.3975 0.3225 0.3975 0.3225 1/2/2013 3400
1/3/2013 0.3738 0.2800 0.3400 0.2900 1/3/2013 48933
1/4/2013 0.4000 0.3175 0.3600 0.3175 1/4/2013 3610
VMGI 12/31/2012 0.0110 0.0090 0.0090 0.0090 12/31/2012 105726
1/1/2013 0.0110 0.0090 0.0090 0.0090 1/1/2013 105726
1/2/2013 0.0100 0.0080 0.0090 0.0100 1/2/2013 188150
1/3/2013 0.0180 0.0110 0.0110 0.0150 1/3/2013 169890
1/4/2013 0.0180 0.0140 0.0150 0.0180 1/4/2013 33500
严格地说,reindex
的最后一位并非完全必要。但令我困扰的是,我可能正在重新安排日期。所以我把它们放回原位。