Pandas groupby计算每n行的平均值
Posted
技术标签:
【中文标题】Pandas groupby计算每n行的平均值【英文标题】:Pandas groupby calculate mean of every nth row 【发布时间】:2021-11-08 14:47:51 【问题描述】:我有以下数据框:
GroupID | Idx | Value |
---|---|---|
0 | 1 | 2 |
0 | 2 | 3 |
0 | 3 | 4 |
1 | 1 | 9 |
1 | 2 | 4 |
1 | 3 | 1 |
2 | 1 | 7 |
2 | 2 | 8 |
2 | 3 | 2 |
... | ... | ... |
我想计算每个组的第n个平均值,即每个组的第一行,第二行,...的平均值,所以结果是
GroupID | Idx | Value | Mean |
---|---|---|---|
0 | 1 | 2 | 6 |
0 | 2 | 3 | 5 |
0 | 3 | 4 | 2.33 |
1 | 1 | 9 | 6 |
1 | 2 | 4 | 5 |
1 | 3 | 1 | 2.33 |
2 | 1 | 7 | 6 |
2 | 2 | 8 | 5 |
2 | 3 | 2 | 2.33 |
... | ... | ... |
我试过了
def calc_nth_mean(df, grouper, col, n):
return df.groupby(grouper)[col].nth(n).mean()
avg = []
for i in range(0, 90):
avg.append(calc_nth_mean(data, "Group", "Value", i))
效果很好,但这对我来说似乎不是最有效的解决方案。
【问题讨论】:
【参考方案1】:如果您没有 'Idx' 列,您可以 groupby
两次并在第一个 groupby
中使用 cumcount
来获取组中的位置:
df['Mean'] = df.groupby(df.groupby('GroupID').cumcount())['Value'].transform('mean')
但是由于您已经有了“Idx”,并且假设您可以依靠此列来确定组中的位置(可能并非如此),所以只需:
df['Mean'] = df.groupby('Idx')['Value'].transform('mean')
输出:
GroupID Idx Value Mean
0 0 1 2 6.000000
1 0 2 3 5.000000
2 0 3 4 2.333333
3 1 1 9 6.000000
4 1 2 4 5.000000
5 1 3 1 2.333333
6 2 1 7 6.000000
7 2 2 8 5.000000
8 2 3 2 2.333333
【讨论】:
以上是关于Pandas groupby计算每n行的平均值的主要内容,如果未能解决你的问题,请参考以下文章
如何计算 n 行的平均值并将答案粘贴到 pandas 列的下 n 行?
group的加权平均值不等于pandas groupby中的总平均值
pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值滚动中位数滚动最大最小值滚动加和等