У меня есть мультииндексный DataFrame, и я пытаюсь выбрать данные в нем на основе определенных критериев, пока что все хорошо. Проблема в том, что после того, как я выбрал свои данные, используя .loc и pd.IndexSlice, результирующий DataFrame, который должен логически иметь меньше строк и меньше элементов на первом уровне мультииндекса, сохраняет точно такой же multiIndex, но с некоторыми ключами в нем, ссылаясь на пустой фрейм данных.
Я пытался создать совершенно новый DataFrame с новым индексом, но структура моего набора данных усложняется, и на данном уровне не всегда одинаковое количество элементов, поэтому создать DataFrame непросто с правильной формой, в которую я могу поместить данные.
import numpy as np
import pandas as pd
np.random.seed(3) #so my exemple is reproductible
idx = pd.IndexSlice
iterables = [['A','B','C'],[0,1,2],['some','rdm','data']]
my_index = pd.MultiIndex.from_product(iterables,names =
['first','second','third'])
my_columns = ['col1','col2','col3']
df1 = pd.DataFrame(data = np.random.randint(10,size =
(len(my_index),len(my_columns))),
index = my_index,
columns = my_columns
)
#Ok, so let's say I want to keep only the elements in the first level of my index (["A","B","C"]) for
#which the total sum in column 3 is less than 35 for some reasons
boolean_mask = (df1.groupby(level = "first").col3.sum() < 35).tolist()
first_level_to_keep = df1.index.levels[0][boolean_mask].tolist()
#lets select the wanted data and put it in df2
df2 = df1.loc[idx[first_level_to_keep,:,:],:]
Пока все, как и ожидалось
Проблема в том, когда я хочу получить доступ к индексу df2. Я ожидал следующего:
df2.index.levels[0].tolist() == ['B','C']
чтобы быть правдой. Но это то, что дает Истинное утверждение:
df2.index.levels[0].tolist() == ['A','B','C']
Итак, мой вопрос заключается в следующем: есть ли способ выбрать данные и перезапустить dataFrame с мультииндексом, отражающим то, что в нем. Потому что я нахожу странным возможность выбирать несуществующие данные в моем df2:
Я пытался поставить некоторые изображения с данными фреймами, но не смог, потому что мне не хватает «репутации» ... извините за это.
Спасибо, что уделили время!