Pandas和Python中的高级累积分组

时间:2018-03-23 21:34:47

标签: python pandas time-series pandas-groupby

我有一个带有以下时间序列数据的数据帧df:

        a        b      sign
1    -0.066   19.514    -1
2     0.334   19.848     1
3     0.991   20.839     1
4      0.42   21.259     1
5       0.0   21.367     0
6     -0.57   20.797    -1
7    -0.294   20.503    -1
8     0.579   21.082     1
9     0.234   21.316     1
0    -0.954   20.362    -1

我目前正在使用以下累积分组魔法:

df2 = df.groupby((df["sign"] != df['sign'].shift()).cumsum(), as_index=False).agg({'sign': 'first', 'a': ['sum','count']})

产生以下输出(我已经调整了列标题):

    sign     asum   cnt   
0   -1.0    -0.209   1  
1    1.0     1.970   3  
2    0.0     0.000   1  
3   -1.0    -0.813   2  
4    1.0     0.755   2  
5   -1.0    -1.015   1  

到目前为止,这很好地表明了积极和消极的价值观 但是,我不希望将0号作为一个单独的组,我希望它与1组或-1组相关联(取决于我的心情)。

那么实现这一目标的最佳方法是什么?理想情况下我需要输出像这样(假设0组现在将成为1组的一部分):

    sign      a    cnt   
0   -1.0    -0.209  1   
1    1.0     1.970  4           
2   -1.0    -0.813  2   
3    1.0     0.755  2   
4   -1.0    -1.015  1   

2 个答案:

答案 0 :(得分:1)

我不是完全确定你想要的是什么,但这似乎达到了你想要做的事情:

apache

然后,继续使用您上面的确切# change mood to 'negative' when required... mood = 'positive' if mood=='positive': df['sign'].replace(0,1,inplace=True) else: df['sign'].replace(0,-1,inplace=True) ,您最终得到了目标输出(并没有像您那样更改列名称):

groupby

答案 1 :(得分:1)

为什么不将原始符号列中的所有0替换为-1或1?然后,先前与0组关联的行将与-1或1组关联。

将它们更改为一个:

df.sign = df.sign.where(df.sign!=0, 1)

然后,

df.groupby((df["sign"] != df['sign'].shift()).cumsum(), as_index=False).agg({'sign': 'first', 'a': ['sum','count']})

将产生:

       a        sign
     sum count first
0 -0.066     1    -1
1  1.853     4     1
2 -0.864     2    -1
3  0.813     2     1
4 -0.954     1    -1