MultiIndex上的DataFrame.loc()不起作用?

时间:2017-04-15 00:57:54

标签: python pandas dataframe

我有一个带有MultiIndex的大型DataFrame:Date和Stock。 DataFrame有很多列。将DataFrame命名为features。请注意,索引已经排序(我首先按日期,然后按库存假设)。

features.sort_index(inplace=True)
features

enter image description here

现在我想得到一个DataFrame切片,其中所有Date都在一个时间范围内。但显然我做错了,结果仍然包含范围之外的日期。

df2 = features.copy()
df2.loc[pd.IndexSlice[pd.IndexSlice[pd.Timestamp('2015-01-01'):pd.Timestamp('2015-12-31'), :], :]]

enter image description here

请注意,奇怪的是,如果删除大部分列,则相同的.loc调用会成功删除时间范围之外的日期行。

df = features.loc[pd.IndexSlice[:, 'AAPL'], :]
df.loc[pd.IndexSlice[pd.IndexSlice[pd.Timestamp('2015-01-01'):pd.Timestamp('2015-12-31'), :], :]]

enter image description here

问题:我做错了什么,还是个错误?

P.S:

$ python --version
Python 3.5.2

$ python -c "import pandas as pd; print(pd.__version__)"
0.18.1

修改

它可能是pandas 0.18.1中的一个错误。我说这个的原因是我升级到0.19.2(pip install --upgrade pandas后)后问题就消失了。

另一种可能性是我的ipython笔记本需要重启。但是,在尝试这个问题之前,我确实尝试重启内核并重新运行上面的代码几次,所以我倾向于认为这不是原因。

2 个答案:

答案 0 :(得分:0)

考虑数据框df

mux = pd.MultiIndex.from_product(
    [pd.to_datetime(['2014-12-15', '2015-01-01', '2015-12-31']),
     ['AAPL', 'AMZN', 'CVX', 'GE', 'F']],
    names=['Date', 'Ticker']
)

# special note of the `sort_index`
# this is necessary for using `pd.IndexSlice
df = pd.DataFrame(list(range(len(mux))), mux).sort_index()

                    0
Date       Ticker    
2014-12-15 AAPL     0
           AMZN     1
           CVX      2
           F        4
           GE       3
2015-01-01 AAPL     5
           AMZN     6
           CVX      7
           F        9
           GE       8
2015-12-31 AAPL    10
           AMZN    11
           CVX     12
           F       14
           GE      13
df.loc[pd.IndexSlice[pd.Timestamp('2015-01-01'):pd.Timestamp('2015-12-31'), :], :]
# equivalent to
# df.loc[pd.IndexSlice['2015-01-01':'2015-12-31', :], :]

                    0
Date       Ticker    
2015-01-01 AAPL     5
           AMZN     6
           CVX      7
           F        9
           GE       8
2015-12-31 AAPL    10
           AMZN    11
           CVX     12
           F       14
           GE      13

这很好用。您正在使用不正确的嵌套pd.IndexSlice

答案 1 :(得分:0)

正如我对OP的编辑提到的那样,在我升级到0.19.2之后问题就消失了(通过pip install --upgrade pandas)。出于这个原因,我倾向于认为它可能是pandas 0.18.1中的一个错误。

我会发布这个答案来结束我自己的问题,但是如果仍有0.18.1的人认为我在这里错了,请与我联系,我们可以深入挖掘(可能是我向你分享DataFrame)并尝试重新编写0.18.1)。