在大熊猫群内分组

时间:2017-11-07 22:47:42

标签: python pandas group-by

考虑以下数据集:

min    5-min     a
0       0        800
0       0        801
1       0        802
1       0        803
1       0        804
2       0        805
2       0        805
2       0        810
3       0        801
3       0        802
3       0        803
4       0        804
4       0        805
5       1        806
5       1        800
5       1        890
6       1        890
6       1        880
6       1        800
7       1        804
7       1        806
8       1        801
9       1        800
9       1        900
10      1        770
10      1        803
10      1        811

我需要根据分钟计算每组的std,然后计算每组5分钟的结果值的平均值。 我不知道如何在计算std后找到5分钟的边界。 我应该如何保存数据以了解哪个std属于每组5分钟?

data.groupby('minute').a.std()

我很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

不是100%明确你的要求......但我认为这就是你所需要的:

data.groupby(['min','5-min']).std().groupby('5-min').mean()

根据“min”列计算的平均值的5分钟列找到标准差。

答案 1 :(得分:1)

Taskos的答案很棒,但我不确定您是否需要将数据推回到数据框中。假设您想要的是在每次groupby操作后在父级中添加新列,我选择按照以下方式为您执行此操作

import pandas as pd

df = your_df

# First we create the standard deviation column

def add_std(grp):
    grp['stdevs'] = grp['a'].std()
    return grp

df = df.groupby('min').apply(add_std)

# Next we create the 5 minute mean column

def add_meandev(grp):
    grp['meandev'] = grp['stdevs'].mean()
    return grp

print(df.groupby('5-min').apply(add_meandev))

这可以通过链接等更优雅地完成,但我选择这样做,以便您可以更清楚地看到基础过程。

此最终输出如下所示:

    min  5-min    a     stdevs    meandev
0     0      0  800   0.707107   1.345283
1     0      0  801   0.707107   1.345283
2     1      0  802   1.000000   1.345283
3     1      0  803   1.000000   1.345283
4     1      0  804   1.000000   1.345283
5     2      0  805   2.886751   1.345283
6     2      0  805   2.886751   1.345283
7     2      0  810   2.886751   1.345283
8     3      0  801   1.000000   1.345283
9     3      0  802   1.000000   1.345283
10    3      0  803   1.000000   1.345283
11    4      0  804   0.707107   1.345283
12    4      0  805   0.707107   1.345283
13    5      1  806  50.318983  39.107147
14    5      1  800  50.318983  39.107147
15    5      1  890  50.318983  39.107147
16    6      1  890  49.328829  39.107147
17    6      1  880  49.328829  39.107147
18    6      1  800  49.328829  39.107147
19    7      1  804   1.414214  39.107147
20    7      1  806   1.414214  39.107147
21    8      1  801        NaN  39.107147
22    9      1  800  70.710678  39.107147
23    9      1  900  70.710678  39.107147
24   10      1  770  21.733231  39.107147
25   10      1  803  21.733231  39.107147
26   10      1  811  21.733231  39.107147