Как я могу выбрать данные в мультииндексном dataFrame и получить результат dataFrame с соответствующим индексом - PullRequest
1 голос
/ 24 мая 2019

У меня есть мультииндексный 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:

Я пытался поставить некоторые изображения с данными фреймами, но не смог, потому что мне не хватает «репутации» ... извините за это.

Спасибо, что уделили время!

1 Ответ

0 голосов
/ 24 мая 2019

Даже если вы удалите строки, соответствующие определенному значению на уровне индекса, это значение все еще существует. Вы можете сбросить индекс и затем установить эти столбцы обратно в качестве индекса, чтобы сгенерировать MultiIndex с новыми значениями уровня.

df2 = df2.reset_index().set_index(['first','second','third'])

print(df2.index.levels[0].tolist() == ['B','C'])

True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...