Сначала отфильтруйте по boolean indexing
, а затем агрегируйте std
, но, поскольку для значения по умолчанию ddof=1
необходимо установить значение 0
:
d1 = df[(df.Date>dt-datetime.timedelta(days=10))].groupby('Cat')['Val'].std(ddof=0).to_dict()
print (d1)
{'a': 0.28435695432581953, 'b': 0.2908486860242955, 'c': 0.2995981283031974}
Другим решением является использование пользовательской функции:
f = lambda x: np.std(x.loc[(x.Date > dt-datetime.timedelta(days=10)), 'Val'])
d2 = df.groupby('Cat').apply(f).to_dict()
Разница между решениями заключается в том, что если некоторые значения в группе несоответствующих условий удаляются, а для второго решения присваивается значение NaN
:
d1 = {'b': 0.2908486860242955, 'c': 0.2995981283031974}
d2 = {'a': nan, 'b': 0.2908486860242955, 'c': 0.2995981283031974}