Удалите индекс из фрейма данных MultiIndex, если у дочернего индекса есть критерий соответствия значения столбца - PullRequest
0 голосов
/ 20 сентября 2018

Я изначально задавал этот вопрос здесь , и я считаю, что он был неправильно помечен как дубликат.Я сделаю все возможное, чтобы уточнить мой вопрос и то, как я считаю, что он уникален.

Учитывая следующий пример 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?

1 Ответ

0 голосов
/ 26 сентября 2018

Я получил тот же результат, что и ваш пример решения, выполнив следующее:

df.loc[df.xs('1', level=2)['Val2'] > 5]

Сравнивая производительность по времени, она примерно в 15 раз быстрее (на моем компьютере ваш пример занимает 36 мс, а это занимает 2 мс).

...