Скользящая средняя по фрейму данных для каждого пользователя. Питон, Панды

1

Я хочу добавить столбец в фреймворк данных со значением скользящей средней, исходящей из другого столбца (здесь идет сложная часть) для каждого уникального пользователя.

Первое, что приходит в голову, - это получить список всех уникальных пользователей и перебрать все из них, получая подмножество данных, где пользовательский номер равен этому пользователю:

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 и не могу найти быстрый эквивалент. Есть ли способ использовать здесь лямбда-функцию?

Любая помощь будет оценена по достоинству.

Спасибо!

Теги:
pandas
dataframe

1 ответ

1
Лучший ответ

Если я правильно понимаю, что вы хотели бы сделать, следующее должно работать:

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
(...)
  • 0
    Отлично, легко и быстро. Только одна вещь, во второй строке кода вы имели в виду значения вместо roll_mean. Спасибо!
  • 1
    Рад, что смог помочь! И ты прав конечно. Я починил это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню