首页 > 解决方案 > Pandas MultiIndex 操作

问题描述

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

pandas_datareader 的初始 df 导致以下结构:

在此处输入图像描述

我有兴趣在这个结构中获得“高价”和“收盘价”。为了实现这一点,我做了以下工作:

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

这给了我:

在此处输入图像描述

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

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

这给了我想要的结果,但似乎是一种非常“硬编码”且效率低下的方法: 在此处输入图像描述

有没有更通用的方法可以做到这一点?我希望能够只指定属性(例如收盘价、高价等)以及其中所有股票的结果(按股票而不是属性分组)。这个 Multiindex 对我来说并不容易,因此感谢您提供的任何帮助。

标签: pandaspandas-datareader

解决方案


您可以使用索引切片功能轻松获取它。请更正我在不同股票上测试过的“ACN”和“IT”。参考。MultiIndex / 高级索引

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

推荐阅读