Я хочу добавить столбец в фреймворк данных со значением скользящей средней, исходящей из другого столбца (здесь идет сложная часть) для каждого уникального пользователя.
Первое, что приходит в голову, - это получить список всех уникальных пользователей и перебрать все из них, получая подмножество данных, где пользовательский номер равен этому пользователю:
import pandas as pd
df = pd.DataFrame()
df['user'] = [1,2,3,2,2,1,1,3,3,3,3,3,3,2,1,2,1,2,1,1]
df['value'] = [3,1,5,7,2,2,2,9,8,7,6,5,4,3,2,2,2,1,2,3]
unique_users = df['user'].unique()
df['rolled_value'] = 0
for user in unique_users:
temp_df = df[df['user'] == user]
temp_df['rolled_value'] = temp_df['value'].rolling(2).mean()
Это не работает, потому что это не позволит мне изменить значение столбца, поскольку это копия фрагмента из df, но вы получаете эту идею.
Это было бы ужасно медленным, у меня 10M строк, и это займет навсегда.
Я новичок в python и не могу найти быстрый эквивалент. Есть ли способ использовать здесь лямбда-функцию?
Любая помощь будет оценена по достоинству.
Спасибо!
Если я правильно понимаю, что вы хотели бы сделать, следующее должно работать:
rolled_values = df.groupby('user')'value'].rolling(2).mean().reset_index()
Это возвращает DataFrame, сгруппированный пользователями, столбец "level_1" содержит старый индекс, а столбец "значение" теперь содержит свернутое среднее значение.
user level_1 value
0 1 0 NaN
1 1 5 2.5
2 1 6 2.0
3 1 14 2.0
4 1 16 2.0
5 1 18 2.0
6 1 19 2.5
7 2 1 NaN
8 2 3 4.0
9 2 4 4.5
(...)
Теперь вам просто нужно добавить этот столбец в свой старый DataFrame:
df['rolled_values'] = rolled_values.set_index('level_1')['value']
user value rolled_values
0 1 3 NaN
1 2 1 NaN
2 3 5 NaN
3 2 7 4.0
4 2 2 4.5
(...)