我有一个带有MultiIndex的大型DataFrame:Date和Stock。 DataFrame有很多列。将DataFrame命名为features
。请注意,索引已经排序(我首先按日期,然后按库存假设)。
features.sort_index(inplace=True)
features
现在我想得到一个DataFrame切片,其中所有Date都在一个时间范围内。但显然我做错了,结果仍然包含范围之外的日期。
df2 = features.copy()
df2.loc[pd.IndexSlice[pd.IndexSlice[pd.Timestamp('2015-01-01'):pd.Timestamp('2015-12-31'), :], :]]
请注意,奇怪的是,如果删除大部分列,则相同的.loc
调用会成功删除时间范围之外的日期行。
df = features.loc[pd.IndexSlice[:, 'AAPL'], :]
df.loc[pd.IndexSlice[pd.IndexSlice[pd.Timestamp('2015-01-01'):pd.Timestamp('2015-12-31'), :], :]]
问题:我做错了什么,还是个错误?
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笔记本需要重启。但是,在尝试这个问题之前,我确实尝试重启内核并重新运行上面的代码几次,所以我倾向于认为这不是原因。
答案 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)。