我正在尝试使用大熊猫创建一个多索引数据框,使其看起来像下面这样,其中我将“关闭”作为属性的属性,将“ 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
我在这里做错了什么?预先感谢您的帮助!!
答案 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