Я изначально задавал этот вопрос здесь , и я считаю, что он был неправильно помечен как дубликат.Я сделаю все возможное, чтобы уточнить мой вопрос и то, как я считаю, что он уникален.
Учитывая следующий пример MultiIndex
dataframe:
import pandas as pd
import numpy as np
first = ['A', 'B', 'C']
second = ['a', 'b', 'c', 'd']
third = ['1', '2', '3']
indices = [first, second, third]
index = pd.MultiIndex.from_product(indices, names=['first', 'second', 'third'])
df = pd.DataFrame(np.random.randint(10, size=(len(first)*len(second)*len(third), 4)), index=index, columns=['Val1','Val2',' Val3', 'Val4'])
Цель: Я хотел бы сохранить конкретный индекс level=1
(например, 'a'
), если значение столбца 'Val2'
, соответствующее значению индекса 1
в level=2
, превышает 5
для этого индекса level=1
.Следовательно, если этот критерий не выполняется (т. Е. Столбец 'Val2'
меньше или равен 5
для индекса 1
в level=2
), то соответствующий индекс level=1
будет удален из кадра данных.Если все индексы level=1
не соответствуют критериям для данного индекса level=0
, этот индекс level=0
также будет удален.Мой предыдущий пост содержит ожидаемый результат (я могу добавить его сюда, но я хотел, чтобы этот пост был как можно более кратким для ясности).
Вот мое текущее решение, производительность которого, я уверен, можетбыть улучшено:
grouped = df.groupby(level=0)
output = pd.concat([grouped.get_group(key).groupby(level=1).filter(lambda x: (x.loc[pd.IndexSlice[:, :, '1'], 'Val2']>5).any()) for key, group in grouped])
Это действительно дает желаемый результат, но для фрейма данных с 100 000 строк, производительность довольно низкая.Есть ли что-то очевидное, чего мне не хватает, чтобы лучше использовать скрытую оптимизацию pandas
?