切片一列的值并在python中计算平均值

时间:2018-07-05 08:19:59

标签: python dataframe time slice

我有一个包含三列的数据框:

a      b      c
0      73     12
73     80     2
80     100    5
100    150    13

“ a”和“ b”中的值为天。我需要在每个30天的间隔中找到“ c”的平均值(在30天的[min(a),max(b)]内的切片值,并计算c的平均值)。因此,我想要一个这样的数据框:

aa     bb     c_avg
0      30     12
30     60     12
60     90     6.33
90     120    9
120    150    13

另一个示例数据可能是:

        a       b       c
    0   1264.0  1629.0  0.000000
    1   1629.0  1632.0  133.333333
    6   1632.0  1699.0  0.000000
    2   1699.0  1706.0  21.428571
    7   1706.0  1723.0  0.000000
    3   1723.0  1726.0  50.000000
    8   1726.0  1890.0  0.000000
    4   1890.0  1893.0  33.333333
    1   1893.0  1994.0  0.000000

如何进入决赛桌?

1 个答案:

答案 0 :(得分:1)

首先通过定义的DataFramea列创建范围b

a = np.arange(0, 180, 30)
df1 = pd.DataFrame({'aa':a[:-1], 'bb':a[1:]})
#print (df1)

然后通过辅助列tmp交叉连接所有行:

df3 = pd.merge(df1.assign(tmp=1), df.assign(tmp=1), on='tmp')
#print (df3)

最后一个过滤器-按列有2种解决方案:

df4 = df3[df3['aa'].between(df3['a'], df3['b']) | df3['bb'].between(df3['a'], df3['b'])] 
print (df4)
     aa   bb  tmp    a    b   c
0     0   30    1    0   73  12
4    30   60    1    0   73  12
8    60   90    1    0   73  12
10   60   90    1   80  100   5
14   90  120    1   80  100   5
15   90  120    1  100  150  13
19  120  150    1  100  150  13

df4 = df4.groupby(['aa','bb'], as_index=False)['c'].mean()
print (df4)
    aa   bb     c
0    0   30  12.0
1   30   60  12.0
2   60   90   8.5
3   90  120   9.0
4  120  150  13.0

df5 = df3[df3['a'].between(df3['aa'], df3['bb']) | df3['b'].between(df3['aa'], df3['bb'])] 
print (df5)
     aa   bb  tmp    a    b   c
0     0   30    1    0   73  12
8    60   90    1    0   73  12
9    60   90    1   73   80   2
10   60   90    1   80  100   5
14   90  120    1   80  100   5
15   90  120    1  100  150  13
19  120  150    1  100  150  13

df5 = df5.groupby(['aa','bb'], as_index=False)['c'].mean()
print (df5)
    aa   bb          c
0    0   30  12.000000
1   60   90   6.333333
2   90  120   9.000000
3  120  150  13.000000