我有一个数据框,其中事件和持续时间作为列。
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 个相同的事件
提前谢谢您!
最佳答案
使用boolean indexing
,按 tail
过滤最后 3 个并获取平均值
:
a = activity_df.loc[activity_df['activities']=='work', 'duration'].tail(3).mean()
更通用的解决方案是通过GroupBy.tail
创建事件
的所有最后3行的平均值
。 :
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
和聚合平均值
:
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
关于python - 使用相同的字符串过滤前 3 行并在 python 中计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50838369/