创建多索引数据框(有些细微差别)

时间:2019-07-06 23:32:47

标签: python-3.x pandas dataframe

我正在尝试使用大熊猫创建一个多索引数据框,使其看起来像下面这样,其中我将“关闭”作为属性的属性,将“ SPY”和“ FNSR”作为符号的属性。 SPY和FNSR都是“关闭”列下方的子列。每个符号的值对应于不同的日期。

Attributes   Close     
Symbols      SPY FNSR
Date                 
2011-01-01     2   21
2011-01-02     3   22

为构建此代码,我编写了以下代码:

df2 = pd.DataFrame({
    'Attributes' : ['Close','Close'],
    'Date' : [datetime(2011,1,1),datetime(2011,1,2)],
    'Symbols': ['SPY','FNSR'],
    'SPY' : [2,3],
    'FNSR': [21,22],
})

todayPrice2 = df2.set_index(['Date','Attributes']).stack().unstack([1,2])

我得到的输出在某种程度上接近我想要的输出,但最终我将“符号”作为其自己的子列在“关闭”下方,而不是作为索引。

Attributes   Close         
           Symbols SPY FNSR
Date                       
2011-01-01     SPY   2   21
2011-01-02    FNSR   3   22

我在这里做错了什么?预先感谢您的帮助!!

2 个答案:

答案 0 :(得分:0)

符号在列和行中重复。放下'Symbols': ['SPY','FNSR']

df2 = pd.DataFrame({
    'Attributes' : ['Close','Close'],
    'Date' : [datetime(2011,1,1),datetime(2011,1,2)],
    'SPY' : [2,3],
    'FNSR': [21,22],
})

df2.set_index(['Date','Attributes']).unstack(1).swaplevel(axis=1)

或者,将数据组织为

df2 = pd.DataFrame({
    'Date' : [datetime(2011,1,1),datetime(2011,1,2)]*2,
    'Symbols':['SPY']*2+['FNSR']*2,
    'Close' : [2,3,21,22],
})

df2.set_index(['Date','Symbols']).unstack(1)

答案 1 :(得分:0)

您可以使用以下方法在set_index()之后过滤数据框:

todayPrice2 = df2.set_index(['Date','Attributes'])[['SPY','FNSR']].stack().unstack([1,2])
todayPrice2

输出:

Attributes Close     
             SPY FNSR
Date                 
2011-01-01     2   21
2011-01-02     3   22

或使用元组符号删除列:

todayPrice2 = df2.set_index(['Date','Attributes']).stack().unstack([1,2])\
                 .drop(('Close','Symbols'), axis=1)
print(todayPrice2)

输出:

Attributes Close     
             SPY FNSR
Date                 
2011-01-01     2   21
2011-01-02     3   22

而且,如果您确实想要这些轴命名:

todayPrice2 = df2.set_index(['Date','Attributes']).stack().unstack([1,2])\
                 .drop(('Close','Symbols'), axis=1).rename_axis(['Attributes', 'Symbols'], axis=1)
print(todayPrice2)

输出:

Attributes Close     
Symbols      SPY FNSR
Date                 
2011-01-01     2   21
2011-01-02     3   22