Отфильтруйте предыдущие 3 строки с той же строкой и вычислите среднее значение в python - PullRequest
0 голосов
/ 13 июня 2018

У меня есть фрейм данных с действиями и продолжительностью в виде столбцов.

duration = np.random.randint(4, size = 30)
activities = ['work', 'home', 'work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home', 'work', 'home']
activity_df = pd.DataFrame({'activities':activities, 'duration':duration})

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

Любой из вас, ребята, знает, как это сделатьэто?

мой вывод должен быть третьим столбцом, где в каждой строке вычисляются 3 предыдущих действия

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Используйте boolean indexing, отфильтруйте последние 3 по tail и получите mean:

a = activity_df.loc[activity_df['activities']=='work', 'duration'].tail(3).mean()

Более общее решение - создать means по всем последним 3 строкам activities по GroupBy.tail:

s = activity_df.set_index('activities').groupby('activities').tail(3).mean(level=0)
print (s)

РЕДАКТИРОВАТЬ:

np.random.seed(1256)

duration = np.random.randint(4, size = 30)
activities = ['work', 'home', 'work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home','work', 'home', 'work', 'home']

Для вашего нового выхода необходимо groupby с rolling и совокупностью mean:

activity_df = pd.DataFrame({'activities':activities, 'duration':duration})

activity_df['roll'] = (activity_df.groupby('activities')['duration']
                                  .rolling(3)
                                  .mean()
                                  .reset_index(level=0, drop=True))
print (activity_df)
   activities  duration      roll
0        work         1       NaN
1        home         2       NaN
2        work         1       NaN
3        home         3       NaN
4        work         0  0.666667
5        home         1  2.000000
6        work         3  1.333333
7        home         0  1.333333
8        work         1  1.333333
9        home         3  1.333333
10       work         1  1.666667
11       home         1  1.333333
12       work         3  1.666667
13       home         2  2.000000
14       work         2  2.000000
15       home         3  2.000000
16       work         0  1.666667
17       home         2  2.333333
18       work         3  1.666667
19       home         0  1.666667
20       work         3  2.000000
21       home         0  0.666667
22       work         1  2.333333
23       home         3  1.000000
24       work         1  1.666667
25       home         2  1.666667
26       work         1  1.000000
27       home         2  2.333333
28       work         2  1.333333
29       home         1  1.666667
0 голосов
/ 13 июня 2018

Вам нужно найти work активность, а затем взять среднее из последних трех строк.

activity_df.loc[activity_df['activities']=='work'][-3:]['duration'].mean()

EDIT

Похоже, вам нужно использовать .rolling () с window=3 для сгруппированных данных, чтобы получить среднее значениепредыдущие 3 строки за activities.

Activity_df ['Rolling_mean'] = Activity_df.groupby ('деятельность'). Rolling (3). Mean (). Reset_index (0, drop = True)

Вывод:

    activities  duration  rolling_mean
0        work         3           NaN
1        home         1           NaN
2        work         3           NaN
3        home         0           NaN
4        work         1      2.333333
5        home         1      0.666667
6        work         3      2.333333
7        home         3      1.333333
8        work         2      2.000000
9        home         0      1.333333
10       work         2      2.333333
11       home         0      1.000000
12       work         0      1.333333
13       home         1      0.333333
14       work         0      0.666667
15       home         3      1.333333
16       work         3      1.000000
17       home         3      2.333333
18       work         0      1.000000
19       home         3      3.000000
20       work         0      1.000000
21       home         3      3.000000
22       work         1      0.333333
23       home         3      3.000000
24       work         3      1.333333
25       home         3      3.000000
26       work         0      1.333333
27       home         3      3.000000
28       work         3      2.000000
29       home         3      3.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...