重新索引 MultiIndex 数据帧的特定级别

Posted

技术标签:

【中文标题】重新索引 MultiIndex 数据帧的特定级别【英文标题】:Reindexing a specific level of a MultiIndex dataframe 【发布时间】:2018-06-19 03:27:03 【问题描述】:

我有一个带有两个索引的 DataFrame,并希望通过其中一个索引重新索引它。

from pandas_datareader import data
import matplotlib.pyplot as plt
import pandas as pd

# Instruments to download
tickers = ['AAPL']

# Online source one should use
data_source = 'yahoo'

# Data range
start_date = '2000-01-01'
end_date = '2018-01-09'

# Load the desired data
panel_data = data.DataReader(tickers, data_source, start_date, end_date).to_frame()
panel_data.head()

重新索引的过程如下:

# Get just the adjusted closing prices
adj_close = panel_data['Adj Close']

# Gett all weekdays between start and end dates
all_weekdays = pd.date_range(start=start_date, end=end_date, freq='B')

# Align the existing prices in adj_close with our new set of dates
adj_close = adj_close.reindex(all_weekdays, method="ffill")

最后一行给出以下错误:

TypeError: '<' not supported between instances of 'tuple' and 'int'

这是因为 DataFrame 索引是一个元组列表:

panel_data.index[0]
(时间戳('2018-01-09 00:00:00'), 'AAPL')

是否可以重新索引adj_close?顺便说一句,如果我不使用 to_frame() 将 Panel 对象转换为 DataFrame,则重新索引将照常工作。但似乎 Panel 对象已被弃用...

【问题讨论】:

也许您正在寻找adj_close.reindex(all_weekdays, level=0).ffill() 完美!那行得通。我很乐意接受它作为答案。非常感谢您的快速回复! 【参考方案1】:

如果您希望在某个级别重新索引,那么reindex 接受您可以传递的level 参数 -

adj_close.reindex(all_weekdays, level=0)

在传递level 参数时,不能同时传递method 参数(reindex 会抛出TypeError),因此可以在之后链接ffill 调用 -

adj_close.reindex(all_weekdays, level=0).ffill()

【讨论】:

以上是关于重新索引 MultiIndex 数据帧的特定级别的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Multiindex 系列级别重新索引

在日期为“关闭”的级别上重新索引 MultiIndex

Pandas:修改特定级别的 Multiindex

连接两个具有不同索引级别数的 MultiIndex DataFrame

按特定索引值过滤具有 MultiIndex 的数据帧 [重复]

pandas multiindex将标签添加到索引级别