2017-10-10 138 views
1

我已经通过从数据传递者获取面板并将其转换为多索引数据帧来创建库存数据的多索引。有时当我使用.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() 

我得到两个指数(Dateminor)系列:

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 

切片是正确的,值是正确的,但我不希望那里的小指数(因为我想通过这个系列来绘图)。什么是正确的方式来切片?

谢谢!

回答

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 
+1

谢谢!这样可行!但为什么这两个切片会有不同的结果呢? 'adj_close.loc ['2010-01-04':'2010-01-06','AAPL']' 和 'adj_close.loc [:,'AAPL']' 看起来很相似。 –

+0

难题。也许是因为第二种解决方案更一般,所以可以使用'adj_close.loc ['2010-01-04':'2010-01-05',['AAPL','SPY']]' – jezrael