繁体   English   中英

Pandas 基于列值的 dataframe 子集的每第 i 行的平均值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM