Как улучшить производительность работы фильтра pandas GroupBy? - PullRequest
0 голосов
/ 09 февраля 2019

Я впервые задаю вопрос.

Я работаю с большим набором данных CSV (он содержит более 15 миллионов строк и имеет размер более 1,5 ГБ).

Iзагружаю выдержки в кадры данных Pandas, работающие в Jupyter Notebooks, чтобы получить алгоритм, основанный на наборе данных.Я группирую данные по MAC-адресу, в результате чего получается более 1 миллиона групп.

Основой для разработки моего алгоритма является выполнение этой операции:

pandas.core.groupby.DataFrameGroupBy.filter

Выполнение этой операции занимает от 3 до 5 минут,в зависимости от набора данных.Чтобы разработать этот алгоритм, я должен выполнить эту операцию сотни, возможно, тысячи раз.

Эта операция связана с процессором и использует только одно из нескольких ядер, доступных на моей машине.Я провел несколько часов, исследуя потенциальные решения онлайн.Я пытался использовать как numba, так и dask, чтобы ускорить эту операцию, и обе попытки привели к исключениям.

Numba предоставил сообщение о том, что «этого не должно было случиться, спасибо за помощьулучшить продукт ».Dask, по-видимому, может не реализовывать операцию DataFrameGroupBy.filter.Я не мог определить, как переписать мой код для использования pool / map.

Я ищу предложения по ускорению этой операции:

pandas.core.groupby.DataFrameGroupBy.filter

Здесьэто пример этой операции в моем коде.Существуют и другие примеры, которые, похоже, имеют примерно одинаковое время выполнения.

import pandas as pd

def import_data(_file, _columns):
    df = pd.read_csv(_file, low_memory = False)
    df[_columns] = df[_columns].apply(pd.to_numeric, errors='coerce')
    df = df.sort_values(by=['mac', 'time'])
    # The line below takes ~3 to 5 minutes to run
    df = df.groupby(['mac']).filter(lambda x: x['latency'].count() > 1)
    return df

Как я могу ускорить это?

1 Ответ

0 голосов
/ 09 февраля 2019

filter обычно известен как медленный при использовании с GroupBy.Если вы пытаетесь отфильтровать DataFrame на основе условия внутри GroupBy, лучшей альтернативой является использование transform или map:

df[df.groupby('mac')['latency'].transform('count').gt(1)]

df[df['mac'].map(df.groupby('mac')['latency'].count()).gt(1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...