我通过从datareader获取面板并将其转换为多索引数据框,创建了多股股票数据索引。有时当我使用.loc
时,我得到一个带有1个索引的系列,有时候我得到一个带有两个索引的系列。如何按日期切片并获得一个索引系列?代码将有助于......
import pandas_datareader.data as web
# Define the securities to download
symbols = ['AAPL', 'MSFT']
# Define which online source one should use
data_source = 'yahoo'
# Define the period of interest
start_date = '2010-01-01'
end_date = '2010-12-31'
# User pandas_reader.data.DataReader to load the desired data.
panel = web.DataReader(symbols, data_source, start_date, end_date)
# Convert panel to multiindex dataframe
midf = panel.to_frame()
# for slicing multiindex dataframes it must be sorted
midf = midf.sort_index(level=0)
在这里,我选择了我想要的列:
adj_close = midf['Adj Close']
adj_close.head()
我收到了一个包含两个索引(Date
和minor
)的系列文章:
Date minor
2010-01-04 AAPL 27.505054
SPY 96.833946
2010-01-05 AAPL 27.552608
SPY 97.090271
2010-01-06 AAPL 27.114347
Name: Adj Close, dtype: float64
现在我使用:
选择苹果来选择所有日期。
aapl_adj_close = adj_close.loc[:, 'AAPL']
aapl_adj_close.head()
获得一系列索引Date
。这就是我要找的!
Date
2010-01-04 27.505054
2010-01-05 27.552608
2010-01-06 27.114347
2010-01-07 27.064222
2010-01-08 27.244156
Name: Adj Close, dtype: float64
但是当我实际按日期切片时,我没有得到那个系列:
sliced_aapl_adj_close = adj_close.loc['2010-01-04':'2010-01-06', 'AAPL']
sliced_aapl_adj_close.head()
我得到了一个包含两个索引的系列文章:
Date minor
2010-01-04 AAPL 27.505054
2010-01-05 AAPL 27.552608
2010-01-06 AAPL 27.114347
Name: Adj Close, dtype: float64
切片是正确的,值是正确的但我不希望那里的次要索引(因为我想将这个系列传递给绘图)。什么是切片的正确方法?
谢谢!
答案 0 :(得分:4)
您可以使用:
df = df.reset_index(level=1, drop=True)
或者:
df.index = df.index.droplevel(1)
另一个解决方案是unstack
为DataFrame
重新塑造,然后按[]
选择:
df = adj_close.unstack()
print (df)
minor AAPL SPY
Date
2010-01-04 27.505054 96.833946
2010-01-05 27.552608 97.090271
2010-01-06 27.114347 NaN
print (df['AAPL'])
Date
2010-01-04 27.505054
2010-01-05 27.552608
2010-01-06 27.114347
Name: AAPL, dtype: float64