[英]Pandas average every ith row of dataframe subset based on column value
我有一个 dataframe,如下所示
id value
11 0
11 3
11 1
11 2
4 3
4 1
4 8
4 2
5 0
5 3
5 1
5 2
4 2
4 0
4 1
4 3
11 2
11 1
11 0
11 3
我希望对具有相等id
的 N (=4) 个子集的第 i_th 行进行平均; 然后,得到以下结果
id value
11 1
11 2
11 0.5
11 2.5
4 2.5
4 0.5
4 4.5
4 2.5
5 0
5 3
5 1
5 2
例如,对于 id=11:
[0+2, 3+1, 1+0, 2+3]/2 = [1, 2, 0.5, 2.5]
您可以创建一个石斑鱼,它将每个连续的相同数字组分组,然后对于每个组,为每个组获取一个cumcount
。 然后,按id
和那个 cumcount 分组:
consecutive_id_grouper = df['id'].ne(df['id'].shift(1)).cumsum()
cumcount_grouper = df['id'].groupby(consecutive_id_grouper).cumcount()
avg = df.groupby([df['id'], cumcount_grouper], as_index=False, sort=False)['value'].mean()
Output:
>>> avg
id value
0 11 1.0
1 11 2.0
2 11 0.5
3 11 2.5
4 4 2.5
5 4 0.5
6 4 4.5
7 4 2.5
8 5 0.0
9 5 3.0
10 5 1.0
11 5 2.0
另一种可能的方法是重塑和取均值。 如果有多个级别的复制组,将会中断。
(df.groupby('id', sort=False)
.apply(lambda x: x['value'].values.reshape(2,-1).T.mean(1) if len(x)==df.id.value_counts().max() else x['value'].values)
.explode()
.reset_index(name='value'))
Output
id value
0 11 1.0
1 11 2.0
2 11 0.5
3 11 2.5
4 4 2.5
5 4 0.5
6 4 4.5
7 4 2.5
8 5 0
9 5 3
10 5 1
11 5 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.