Pandas groupby 计算每第n行的平均值
Pandas groupby calculate mean of every nth row
我有以下数据框:
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))
效果很好,但这对我来说似乎不是最有效的解决方案。
如果您没有 '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
我有以下数据框:
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))
效果很好,但这对我来说似乎不是最有效的解决方案。
如果您没有 '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