Более быстрый способ преобразования группы со средней величиной в Pandas

У меня есть кадр данных Pandas, где я пытаюсь заменить значения в каждой группе средним значением группы. На моей машине строка df["signal"].groupby(g).transform(np.mean) занимает около 10 секунд для запуска с N и N_TRANSITIONS установленными на номера ниже.

Есть ли более быстрый способ добиться того же результата?

 import pandas as pd import numpy as np from time import time np.random.seed(0) N = 120000 N_TRANSITIONS = 1400 # generate groups transition_points = np.random.permutation(np.arange(N))[:N_TRANSITIONS] transition_points.sort() transitions = np.zeros((N,), dtype=np.bool) transitions[transition_points] = True g = transitions.cumsum() df = pd.DataFrame({ "signal" : np.random.rand(N)}) # here is my bottleneck for large N tic = time() result = df["signal"].groupby(g).transform(np.mean) toc = time() print toc - tic 

2 Solutions collect form web for “Более быстрый способ преобразования группы со средней величиной в Pandas”

Текущий метод, используя преобразование

 In [44]: grp = df["signal"].groupby(g) In [45]: result2 = df["signal"].groupby(g).transform(np.mean) In [47]: %timeit df["signal"].groupby(g).transform(np.mean) 1 loops, best of 3: 535 ms per loop 

Использование «трансляции» результатов

  In [43]: result = pd.concat([ Series([r]*len(grp.groups[i])) for i, r in enumerate(grp.mean().values) ],ignore_index=True) In [42]: %timeit pd.concat([ Series([r]*len(grp.groups[i])) for i, r in enumerate(grp.mean().values) ],ignore_index=True) 10 loops, best of 3: 119 ms per loop In [46]: result.equals(result2) Out[46]: True 

Я думаю, вам, возможно, потребуется установить индекс возвращаемого результата трансляции (он работает здесь, потому что его индекс по умолчанию

 result = pd.concat([ Series([r]*len(grp.groups[i])) for i, r in enumerate(grp.mean().values) ],ignore_index=True) result.index = df.index 

Вдохновленный ответом Джеффа. Это самый быстрый метод на моей машине:

 pd.Series(np.repeat(grp.mean().values, grp.count().values)) 
  • Как я могу нормализовать данные в ряде столбцов в моем фрейме данных pandas
  • Python Pandas Создание нескольких данных из списка
  • pandas сводная таблица по убыванию python
  • Как удалить последнюю строку данных фрейма pandas
  • Удаление неполных лет из базы данных панд
  • Объект 'Index' не имеет атрибута 'tz_localize'
  • Панды: как рисовать планку с двумя категориями и по четыре серии?
  • Есть ли эквивалент pandas dplyr :: summary?
  • Python - лучший язык программирования в мире.