#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