【问题标题】:How to calculate continuous increase count number for pandas Series?如何计算熊猫系列的连续增加计数?
【发布时间】:2020-12-23 08:50:05
【问题描述】:

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

假设我有一个系列:

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 循环不够好

【问题讨论】:

  • 给你的东西从np.sign(-s.diff(-1).fillna(0))开始
  • @xyhuang :这个答案有帮助吗?还是你还卡住了?
  • @Pygirl 谢谢,我认为你的回答很好,但我想知道是否有我们可以使用的矩阵方法,for 循环可能不是最快的
  • 我已经更新了我的答案也给了你熊猫解决方案。这将对您有所帮助:stackoverflow.com/questions/25119524/…

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2019-03-04
    • 2020-10-29
    相关资源
    最近更新 更多