熊猫MultiIndex操作

时间:2020-09-01 21:49:55

标签: pandas pandas-datareader

我不太擅长Python,但是我有一个解决问题的“创可贴”解决方案,试图找出是否有更好的做事方法。我有一个从pandas_datareader下载的股票数据框。这给了我一个MultiIndex df,并且我正尝试仅精确化我想要的属性。

pandas_datareader的初始df具有以下结构:

enter image description here

我有兴趣获得这种结构中的“最高价”和“结算价”。为此,我已经完成了以下操作:

  df.loc[:, ['High', 'Close']]

哪个给我:

enter image description here

这很接近我想要的,但是没有按股票分组,而是按属性分组。要按库存对属性进行分组,我尝试交换级别,然后指定所需的列:

newdf = df.swaplevel(axis='columns')
newdf.loc[:, [('BHP.AX','High'),('BHP.AX','Close'),('S32.AX','Close'),('S32.AX','High')]]

这给了我想要的结果,但似乎是一种非常“硬编码”且效率低下的方法: enter image description here

是否有更通用的方法可以执行此操作?我希望能够仅指定属性(例如,收盘价,最高价等),并将结果指定为其中的所有股票(按股票分组而不是属性分组)。此Multiindex对我来说并不容易,因此感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用索引切片功能轻松获得它。我在其他股票上对其进行测试时,请更正“ ACN”和“ IT”。 参考。MultiIndex / advanced indexing

idx = pd.IndexSlice
data = data.loc[:,idx[:,('High','Low','ACN','IT')]] # edit your symbol
data = data.swaplevel(axis='columns')
data.sort_index(level=0, axis=1, inplace=True)

data.head()
    ACN IT
Close   High    Close   High
Date                
2020-03-31  163.259995  169.880005  99.570000   109.160004
2020-04-01  154.679993  160.820007  93.290001   96.209999
2020-04-02  156.270004  160.500000  94.099998   94.919998
2020-04-03  152.149994  158.720001  91.820000   94.290001
2020-04-06  166.050003  166.750000  99.860001   100.940002

答案 1 :(得分:0)

找到了一个相当简单的解决方案。

newdf = rawout.loc[:,['Close','High', 'Open']].swaplevel(axis='columns')

使用此按钮,无需指定所有库存。我在上面的代码中交换了级别,但是其他人可能不需要这样做。