Pandas 多索引操作
Pandas MultiIndex manipulation
我不是很擅长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 对我来说并不容易,因此感谢您提供的任何帮助。
您可以使用索引切片功能轻松获取。请更正 '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
找到了一个相当简单的解决方案。
newdf = rawout.loc[:,['Close','High', 'Open']].swaplevel(axis='columns')
使用这个不需要指定所有的股票。我在上面的代码中交换了级别,但这可能不是其他人所需要的。
我不是很擅长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 对我来说并不容易,因此感谢您提供的任何帮助。
您可以使用索引切片功能轻松获取。请更正 '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
找到了一个相当简单的解决方案。
newdf = rawout.loc[:,['Close','High', 'Open']].swaplevel(axis='columns')
使用这个不需要指定所有的股票。我在上面的代码中交换了级别,但这可能不是其他人所需要的。