Хотя groupby.GroupBy.sem - хороший способ вычислить это, поскольку это готовая функция в pandas, могут быть случаи, когда вам нужно вычислить новый столбец с функцией, которая не существует в библиотеке.
apply () + lambda
Вот как вы бы вычислили новый столбец * с помощью подхода «применить lambda»:
res1 = df.groupby(['time'])['wind_spd_ms'].apply(lambda x: ((x-np.mean(x))**2)/(len(x)-1))
Что важно понимать, поскольку df.groupby(['time'])
- это объект DataFrame (GroupBy), df.groupby(['time'])['wind_spd_ms']
- это объект Series (GroupBy), а функция apply()
, следовательно, - pd.Series.apply . Он принимает функцию в качестве аргумента, и функция будет вызываться с серией pandas (здесь: df.groupby(['time'])['wind_spd_ms']
) в качестве аргумента. Теперь вы уже знаете, как рассчитать стандартное отклонение, если вы получили список / серию.
apply () + другая функция
С помощью apply вы не ограничены лямбдами, но аргумент может быть любой функцией, которая принимает pd.Series
в качестве аргумента. Таким образом, не менее хорошим решением было бы.
def calculate_std(x):
ave = np.mean(x)
return ((x-ave)**2)/(len(x)-1)
res2 = df.groupby(['time'])['wind_spd_ms'].apply(calculate_std)
С немного более сложными вычислениями это гораздо более читаемое и предпочтительное решение .
Насколько быстро работают разные альтернативы?
Можно подумать, что «использование лямбда-выражений быстрее», но если вы сами рассчитаете время функций, то увидите, что прирост скорости от использования лямбда-выражений не происходит:
In [3]: timeit df.groupby(['time'])['wind_spd_ms'].apply(lambda x: ((x-np.mean(x))**2)/(len(x)-1))
3.26 ms ± 358 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [4]: timeit df.groupby(['time'])['wind_spd_ms'].apply(calculate_std)
2.87 ms ± 63.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
С другой стороны, функция sem
, упомянутая oli5679 , работает быстрее
In [5]: timeit df.groupby(['time'])['wind_spd_ms'].sem()
1.33 ms ± 40.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
(хотя функции библиотеки не всегда самые быстрые. Например, использование scipy.ndimage.interpolation.shift
для смещения .. )
* Это уравнение для группового стандартного отклонения (не стандартная ошибка группового среднего)