Python 屏蔽数据帧会在index.levels中留下意外值

Python 屏蔽数据帧会在index.levels中留下意外值,python,pandas,Python,Pandas,我的dataframe有多个索引行,其中的值是日期时间 我想过滤掉几天的外部级别索引,所以我创建了一个布尔掩码 屏蔽操作似乎有效——生成的数据帧不包括我希望排除的天数 但是有一点让人困惑——当我看df.index.levels[0]时,它仍然包括我排除的日期。也就是说,这些行不会出现在数据框中,但索引仍然列出了那些被屏蔽的日期 这让我害怕,我误解了正在发生的事情,可能会给自己制造麻烦 下面是我写的一个玩具示例 import random q = pd.DatetimeIndex(periods=

我的dataframe有多个索引行,其中的值是日期时间

我想过滤掉几天的外部级别索引,所以我创建了一个布尔掩码

屏蔽操作似乎有效——生成的数据帧不包括我希望排除的天数

但是有一点让人困惑——当我看
df.index.levels[0]
时,它仍然包括我排除的日期。也就是说,这些行不会出现在数据框中,但索引仍然列出了那些被屏蔽的日期

这让我害怕,我误解了正在发生的事情,可能会给自己制造麻烦

下面是我写的一个玩具示例

import random
q = pd.DatetimeIndex(periods=100, freq='H', start='2018-12-1', name='stamp')
df = pd.DataFrame(random.sample(range(1,200), 100), index=q, columns=["data"])
df['junk']="placeholder"
df.reset_index(inplace=True)
df['contract'] = df['stamp'].apply(lambda x: x.date())
df.set_index(['contract', 'stamp'], drop=True, inplace=True)

df.sort_index(inplace=True)
idx = pd.IndexSlice
df.loc[idx['2018-12-3',:],:]

#i want to exclude where contract is 2018-12-02 or 2018-12-03
mask = ~((df.index.get_level_values(0) == '2018-12-02') | (df.index.get_level_values(0) == '2018-12-03'))

masked_df = df.loc[mask].copy()

print(masked_df)  #notice that 2018-12-02 and 2018-12-03 are not in the dataframe
print(masked_df.index.levels[0])  #why are 2018-12-02 and 2018-12-03 still listed in the index?

有删除此值的必要功能,有关此问题的详细信息,请参阅:


我想你误解了我的问题。我创建的掩码正在工作——生成的数据帧不包括级别(0)值为2018-12-02或-03的任何行。但让我困惑的是,当我只列出
df.index.levels[0]
时,它提到了2018-12-02和2018-12-03,尽管在我屏蔽之后显然没有这两行。@user3556757-哦,你是对的。完全改变了答案。
print(masked_df.index.levels[0])
DatetimeIndex(['2018-12-01', '2018-12-02', '2018-12-03', '2018-12-04',
               '2018-12-05'],
              dtype='datetime64[ns]', name='contract', freq=None)

masked_df.index = masked_df.index.remove_unused_levels()
print(masked_df.index.levels[0])  #why ar
DatetimeIndex(['2018-12-01', '2018-12-04', '2018-12-05'], 
               dtype='datetime64[ns]', name='contract', freq=None)