Маскирование кадра данных оставило неожиданные значения в index.levels - PullRequest
0 голосов
/ 14 декабря 2018

В моем фрейме данных есть многоиндексные строки, значения которых - 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?

1 Ответ

0 голосов
/ 14 декабря 2018

Для удаления этих значений необходима функция MultiIndex.remove_unused_levels, дополнительные сведения об этой проблеме см. В github :

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...