我有一个带有以下时间序列数据的数据帧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
答案 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