Выполните группировку и усреднение для предыдущих строк фрейма данных, за исключением текущих

#python #pandas #aggregate

Вопрос:

Мне нужно вычислить переменную, равную среднему значению за предыдущий раз. Например, импортируйте панд в качестве pd

 list_of_tuples = [('A', '2021-01-01', 1, np.nan),  ('A', '2021-01-02', 2, 1),  ('A', '2021-01-03', 3, 1.5),  ('A', '2021-01-04', 4, 2),  ('A', '2021-01-05', 5, 2.5),  ('B', '2021-01-01', 1, np.nan),  ('B', '2021-01-02', 2, 1),  ('B', '2021-01-03', 3, 1.5)]  df = pd.DataFrame.from_records(data=list_of_tuples, columns=['ID', 'DATE', 'VALUE', 'RESULT'])   ID DATE VALUE RESULT  A 2021-01-01 1 NaN #no previous info  A 2021-01-02 2 1.0 #== 1/1  A 2021-01-03 3 1.5 #== (1   2)/2  A 2021-01-04 4 2.0  A 2021-01-05 5 2.5  B 2021-01-01 1 NaN #no previous info  B 2021-01-02 2 1.0 #== 1/1  B 2021-01-03 3 1.5  

в столбце РЕЗУЛЬТАТ каждое значение равно среднему значению в текущей группе за предыдущее время

Заранее благодарю вас!

Ответ №1:

Предполагая, что ваши даты отсортированы, вы можете groupby вычислить кумулированную сумму ( cumsum ), затем разделить на номер строки (полученный с cumcount помощью), наконец mask , первые значения для каждой группы (строка 0 для каждой группы).:

 g = df.groupby('ID')['VALUE'] count = g.cumcount() df['RESULT'] = (g.cumsum().shift()/count).mask(count.eq(0))  

выход:

 ID DATE VALUE RESULT 0 A 2021-01-01 1 NaN 1 A 2021-01-02 2 1.0 2 A 2021-01-03 3 1.5 3 A 2021-01-04 4 2.0 4 A 2021-01-05 5 2.5 5 B 2021-01-01 1 NaN 6 B 2021-01-02 2 1.0 7 B 2021-01-03 3 1.5