如何计算熊猫系列的连续增加计数?

时间:2020-12-23 08:50:05

标签: python pandas

我想计算每个元素未来的连续增加或减少计数。

假设我有一个系列:

l=[10, 9, 8, 9, 10, 9, 10, 11, 10, 12, 10]
s=pd.Series(l)

预期输出为:

o=[-2, -1, 2, 1, -1, 2, 1, -1, 1, -1, 0]

解释如下:

第一个元素是10,接下来是9,接下来是8,所以,减少了2次,所以输出是-2,对于第三个元素是8,增加了2次(接下来是9, 10),所以输出为 2。

关键点是连续的,一旦有反向数据,就应该停止向前看。

我该如何实现?我认为 for 循环不够好

1 个答案:

答案 0 :(得分:1)

第一次得到差异的迹象。然后找出有多少是连续的相同符号。如果相同,则添加数量。 试试:

import numpy as np
l=np.array([10, 9, 8, 9, 10, 9, 10, 11, 10, 12, 10])
sign = np.sign(np.diff(l))
count = {}
for i in range(len(sign)-1):
    count[i] = sign[i]
    for j in range(i+1, len(sign)):
        if sign[i]==sign[j]:
            count[i] += sign[j]
        else:
            break
count[i+1] = 0
res = count.values()

资源:

dict_values([-2, -1, 2, 1, -1, 2, 1, -1, 1, 0])

编辑:

如果您想使用 pandas

df = pd.DataFrame(sign, columns=['col'])
df = df[::-1]
x = df.groupby((df['col'] != df['col'].shift(1)).cumsum()).cumsum()['col']
x.iloc[0]=0
x = x.values[::-1]

x:

array([-2, -1,  2,  1, -1,  2,  1, -1,  1,  0])

而不是:

(df['col'] != df['col'].shift(1)).cumsum()

你可以使用

df.col.diff().ne(0).cumsum()

Explanation

相关问题