使用相同的字符串过滤前3行,并在python中计算平均值

使用相同的字符串过滤前3行,并在python中计算平均值,python,python-3.x,pandas,numpy,dataframe,Python,Python 3.x,Pandas,Numpy,Dataframe,我有一个以活动和持续时间为列的数据框架 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',

我有一个以活动和持续时间为列的数据框架

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个作品中的一个,并将其作为一个新功能

你们有谁知道怎么做吗

我的输出应该是第三列,其中每行计算前3个相同的活动


提前谢谢你

您需要查找
工作
活动,然后取最后三行的平均值

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

似乎您需要在分组数据上使用with
window=3
,以获得每个
活动前3行的平均值

活动\ df['rolling\ u mean']=活动\ df.groupby('activities')。滚动(3.mean()。重置\索引(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
使用,过滤最后3个,并获得
平均值

a = activity_df.loc[activity_df['activities']=='work', 'duration'].tail(3).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)
更通用的解决方案是通过所有最后3行
活动创建
mean
s,方法是:

编辑:

对于新的输出需求,请使用和聚合
平均值

a = activity_df.loc[activity_df['activities']=='work', 'duration'].tail(3).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)

根据OP的数据,输出将是随机的@jpp,你说得对。对于示例数据,输出如前所述,我希望遍历这些行,用相同的字符串值过滤最后一行,并计算平均值。这意味着,对于前两行,我没有前面的3个值,但从第三行开始,我想迭代这些行,用相同的字符串过滤前面的3个值,并计算每行eat的平均值……可能吗?我想是的,这是
滚动
你是最好的@jazrael!这正是我需要的
   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