python - Pandas - 如何获取连续负值和正值的计数

标签 python pandas

如何在 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/

相关文章:

python - 通过仅获取元组的第一个值来重新格式化元组列表时出现问题?

python - 我应该单独提交 .lock 文件更改吗?我应该为提交消息写些什么?

python - 在 Django 中加载具有多对一关系的夹具

python - React : NoReverseMatch: Reverse for 'password_reset_confirm' not found. 'password_reset_confirm' 不是有效的 View 函数或模式名称

python - 如何从一个 pandas 数据帧中减去另一个数据帧的行?

python - 选择表中按 Pandas 分组的行

python - 如何找到 Pandas 时间序列的事件持续时间

python - 将行添加到 Dataframe 时出现 ValueError

python - 如何避免在 Python 文件输入库中缓冲

python - 如何选择除最后两个 tr 之外的所有 tr