Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reindexing a specific level of a MultiIndex dataframe

I have a DataFrame with two indices and would like to reindex it by one of the indices.

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()

Screenshot

The reindexing goes as follows:

# 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")

The last line gives the following error:

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

This is because the DataFrame index is a list of tuples:

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

Is it possible to reindex adj_close? By the way, if I don't convert the Panel object to a DataFrame using to_frame(), the reindexing works as it is. But it seems that Panel objects are deprecated...

like image 478
Bruno Avatar asked Jan 10 '18 02:01

Bruno


People also ask

How do I drop one level of MultiIndex Pandas?

To drop multiple levels from a multi-level column index, use the columns. droplevel() repeatedly. We have used the Multiindex. from_tuples() is used to create indexes column-wise.

How do I reindex a data frame?

One can reindex a single column or multiple columns by using reindex() method and by specifying the axis we want to reindex. Default values in the new index that are not present in the dataframe are assigned NaN.


1 Answers

If you're looking to reindex on a certain level, then reindex accepts a level argument you can pass -

adj_close.reindex(all_weekdays, level=0)

When passing a level argument, you cannot pass a method argument at the same time (reindex throws a TypeError), so you can chain a ffill call after -

adj_close.reindex(all_weekdays, level=0).ffill()
like image 180
cs95 Avatar answered Oct 06 '22 23:10

cs95