熊猫-如何连续获取负值和正值

时间:2018-11-24 19:37:04

标签: python pandas

如何在没有熊猫循环的情况下连续计算负数和正值的数量(计数)和总和?我想获得连续负值的最大和,以及连续正值的最大和。数据框示例:

SELECT 
    B.employee_name
FROM customers A 
INNER JOIN employees B 
ON      A.cust_id = B.cust_id
ORDER BY 
    A.cust_id

我希望输出为:

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 不能解决问题,因为它没有对订单进行分组。也许某种SQL查询? pd.groupby()

1 个答案:

答案 0 :(得分:2)

我的方法是首先给每个“连续相同的符号”-组一个不同的数字,以便继续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