Оптимизация pandas groupby () для большого набора данных, который объединяет двоичные столбцы - PullRequest
1 голос
/ 28 февраля 2020

У меня есть кадр данных в формате:

   template          is_a is_b is_c is_d is_e
0  cv_template        0    1     0    0    0
1  topic_template     1    0     0    0    0
2  model_template     1    0     0    0    0
3  model_template     0    1     0    0    0               

Я бы хотел сгруппировать по template и объединить столбцы is_, которые являются двоичными значениями для каждого template.

то есть в приведенном выше примере выходные данные будут такими:

   template          is_a is_b is_c is_d is_e
0  cv_template        0    1     0    0    0
1  topic_template     1    0     0    0    0
2  model_template     1    1     0    0    0         

Мое текущее решение - сделать что-то вроде этого:

df.groupby('template', as_index=False)['is_a', 'is_b', 'is_c', 'is_d'].max()

Однако при работе с большими наборами данных группировка выполняется медленно. Мне было интересно, есть ли лучший способ сделать это, что ускорит процесс.

1 Ответ

1 голос
/ 28 февраля 2020

Я не уверен, что это будет намного быстрее. Но я положил это вместе с Numba

import pandas as pd
import numpy as np
from numba import njit

@njit
def max_at(i, a, shape):
    out = np.zeros(shape, np.int64)
    for j in range(len(a)):
        row = a[j]
        pos = i[j]
        cur = out[pos]
        out[pos, :] = np.maximum(cur, row)
    return out

i, t = df['template'].factorize()
cols = ['is_a', 'is_b', 'is_c', 'is_d', 'is_e']
is_ = np.column_stack([df[c].to_numpy() for c in cols])

result = max_at(i, is_, (len(t), len(cols)))

pd.DataFrame(result, t, cols).reset_index()

            index  is_a  is_b  is_c  is_d  is_e
0     cv_template     0     1     0     0     0
1  topic_template     1     0     0     0     0
2  model_template     1     1     0     0     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...