В моем фрейме данных есть многоиндексные строки, значения которых - datetime.
Я хочу отфильтровать несколько дней индекса внешнего уровня, поэтому я создал логическую маску.
Кажется, операция маскирования работает - итоговый кадр данных не включает дни, которые я хотел бы исключить.
Но есть кое-что сбивающее с толку - когда я смотрю на 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?