Pandas групповое улучшение производительности - PullRequest
0 голосов
/ 09 июля 2020

У меня есть следующая операция:

output = (df_pointer
            .add(df1_pointer.dropna(how='all').sum(axis=1)
                 .groupby(level=0).sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

df_pointer - это большой контейнер, который изначально заполнен нулями, но становится все более и более плотным.

df1_pointer is многоиндексный фрейм данных (с двумя уровнями), очень разреженный, полный nan и нулей.

Мне нужно суммировать по столбцам, а затем по индексу уровня 1 (так называемому «слою»).

Есть несколько особенностей, которые я знаю.

Для каждого ключа индекса уровня 0 («Сущность») у меня есть ровно восемь наблюдений в индексе «Слой»:


Column             1    2    3    4    5    6    7    8    9    10    11    12    13    14    15
Entity    Layer
1        1        1    NaN    0.0    0.0    NaN    NaN    0.0    0.0    NaN    NaN    NaN    0.0    NaN    0.0    0.0    72.0
        2        NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    0.0
        3        NaN    0.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
        4        NaN    NaN    0.0    NaN    NaN    0.0    NaN    NaN    NaN    NaN    NaN    NaN    0.0    NaN    19.5
        5        NaN    NaN    NaN    NaN    1.32435    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
....

I пробовал:

output = (df_pointer
            .add(df1_pointer.dropna(how='all').sum(axis=1)
                 .groupby('Entity').sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

6.8 ms ± 829 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)

output2 = (df_pointer
            .add(df1_pointer.dropna(how='all').sum(axis=1)
                 .groupby(level=0).sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

7.71 ms ± 518 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)

output2 = (df_pointer
            .add(df1_pointer[df1_pointer!=0].dropna(how='all').sum(axis=1)
                 .groupby('Entity').sum()
                 .rename(str(trigger)).to_frame(), fill_value=0))

7.96 ms ± 429 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)

output3 = (df_pointer
            .add(df1_pointer[df1_pointer!=0].dropna(how='all').sum(axis=1)
                 .unstack('Layer').sum(axis=1)
                 .rename(str(trigger)).to_frame(), fill_value=0))

9.26 ms ± 2.54 ms per loop (mean ± std. dev. of 20 runs, 10 loops each)

trigger - это просто имя столбца для конкретной итерации. Иногда это список чисел, иногда это просто число. В этом примере это происходит из следующего списка имен столбцов: trigger_list=list(range(1,16))

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