使用相同的字符串过滤前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()
编辑
似乎您需要在分组数据上使用withwindow=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