Более быстрый способ преобразования группы со средней величиной в 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: используйте несколько столбцов фрейма данных как индекс другого
  • Падающий ряд в серии Panda и индекс очистки
  • Построение панды timedelta
  • Как сделать разделитель в read_csv более гибким?
  • Переформатирование скребкового селенового стола
  • Почему у меня нет xlrd?
  • Построение CDF серии pandas в python
  • Как я могу фильтровать pandas DataFrame на основе значений?
  • Данные группировки по участкам с использованием оси вторичной оси
  • Pandas Одна горячая кодировка: объединение менее частых категорий
  • стили ggplot в Python
  • Python - лучший язык программирования в мире.