如何在 pandas 中没有太多循环的情况下计算连续的负值和正值的数量(计数)和总和?我想要获得连续负数的最大总和以及连续正数的最大总和。示例数据框:
datetime Value
2018-11-12 15:10:00 2.00
2018-11-12 15:20:00 -10.50
2018-11-12 15:30:00 10.50
2018-11-12 15:40:00 7.50
2018-11-12 15:50:00 8.00
2018-11-12 16:10:00 -20.00
2018-11-12 16:20:00 -10.00
我希望输出是:
Max # of negatives in a row: 2, Total value = -30.00
Max # of positives in a row: 3, Total value = 26.00
简单的 pd.groupby()
无法解决问题,因为它不会对订单进行分组。也许某种sql查询? pd.query()
?
最佳答案
我的方法是首先为每个“连续的相同符号”分组不同的数字,以便继续groupby
。
将 Value 与其移位数组的符号进行比较,得出这些组的分隔符。如果需要的话,累积求和会产生唯一的数字、标识符:
df['grpnum'] = (np.sign(df.Value) != np.sign(df.Value.shift())).cumsum()
然后您可以按此标识符进行分组并计算组的长度、总和及其符号:
ranking = df.groupby('grpnum').agg([sum, len, lambda x: sum(x)>0]).Value
这导致
sum len <lambda>
grpnum
1 2.0 1.0 True
2 -10.5 1.0 False
3 26.0 3.0 True
4 -30.0 2.0 False
print(ranking.groupby('<lambda>')['sum', 'len'].apply(lambda g: g[g['len']==g['len'].max()]))
sum len
<lambda> grpnum
True 3 26.0 3.0
False 4 -30.0 2.0
关于python - Pandas - 如何获取连续负值和正值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53461722/