【问题标题】:get count of all positive values from a the last 150 rows at each row - pandas从每行的最后 150 行中获取所有正值的计数 - 熊猫
【发布时间】:2018-08-22 21:57:38
【问题描述】:

我有以下数据集,其中每一行都有 Date 列和 Values 列。它同时具有 +ve-ve 值。我必须计算最后 150 行的所有正值。在每一行。所以第 150 行将有空值。然后,以下行将具有最后 150 个 +ve 行的计数,类似地,-ve 列将填充该行之前的负值计数。

我尝试使用:

def get_count_of_all_150_positive_rows_before_this_row(row):
    df1 = row.tail(2)
    df1 = df1.to_frame()
    print(df1.tail())
    # if df1['positive_values'] > 0:
        return (df1['positive_values'].count())


df.apply(get_count_of_all_150_positive_rows_before_this_row, axis=1)

数据集:

Date        values      positive_values    negative_values
01/01/08    0.12344     
02/01/08    -0.12344        
03/01/08    -0.1234433      
04/01/08    -0.12344        
05/01/08    -0.1234433      
06/01/08    -0.12344        
07/01/08    -0.1234433      
08/01/08    -0.12344        
09/01/08    -0.1234433      
10/01/08    0.12344     
11/01/08    -0.12344        
12/01/08    -0.1234433      
13/01/08    -0.12344        
14/01/08    -0.1234433      
15/01/08    -0.12344        
16/01/08    -0.1234433      
17/01/08    -0.12344        
18/01/08    -0.1234433      
19/01/08    0.12344     

【问题讨论】:

  • 你可以为 +-5 添加输出,而不是 150? 15-20行也应该足够了。谢谢。
  • 我已经截断了您的数据.. minimal 示例不需要您的所有行。我们可以用 5 而不是 150 来演示逻辑。
  • @Jason,请提供所需的输出,假设最后 5 行,给定您问题中的截断数据。

标签: python pandas


【解决方案1】:

这可能是您正在寻找的:

import numpy as np

tail = df.tail(5)
pos = len(tail[df['values']>0])
neg = len(tail[df['values']<0])

df['pos_values'], df['neg_values'] = np.nan, np.nan
df.loc[df.index.values[-5:], 'pos_values'] = pos
df.loc[df.index.values[-5:], 'neg_values'] = neg

#         Date    values  pos_values  neg_values
# 0   01/01/08  0.123440         NaN         NaN
# 1   02/01/08 -0.123440         NaN         NaN
# 2   03/01/08 -0.123443         NaN         NaN
# 3   04/01/08 -0.123440         NaN         NaN
# 4   05/01/08 -0.123443         NaN         NaN
# 5   06/01/08 -0.123440         NaN         NaN
# 6   07/01/08 -0.123443         NaN         NaN
# 7   08/01/08 -0.123440         NaN         NaN
# 8   09/01/08 -0.123443         NaN         NaN
# 9   10/01/08  0.123440         NaN         NaN
# 10  11/01/08 -0.123440         NaN         NaN
# 11  12/01/08 -0.123443         NaN         NaN
# 12  13/01/08 -0.123440         NaN         NaN
# 13  14/01/08 -0.123443         NaN         NaN
# 14  15/01/08 -0.123440         1.0         4.0
# 15  16/01/08 -0.123443         1.0         4.0
# 16  17/01/08 -0.123440         1.0         4.0
# 17  18/01/08 -0.123443         1.0         4.0
# 18  19/01/08  0.123440         1.0         4.0

【讨论】:

    【解决方案2】:

    您想使用 pd.rolling() 在给定前一个“周期”计数的情况下对正负数进行滚动计数。

    period = 5
    df['less_than_zero'] = (df['values']
                            .rolling(window=period, min_periods=period)
                            .agg(lambda x: (x < 0).sum()))
    
    df['greater_than_zero'] = (df['values']
                              .rolling(window=period,min_periods=period)
                              .agg(lambda x: (x > 0).sum()))
    

    这应该会给你你想要的

    Out[30]: 
             date    values  less_than_zero  greater_than_zero
    0   01/01/08  0.123440             NaN                NaN
    1   02/01/08 -0.123440             NaN                NaN
    2   03/01/08 -0.123443             NaN                NaN
    3   04/01/08 -0.123440             NaN                NaN
    4   05/01/08 -0.123443             4.0                1.0
    5   06/01/08 -0.123440             5.0                0.0
    6   07/01/08 -0.123443             5.0                0.0
    7   08/01/08 -0.123440             5.0                0.0
    8   09/01/08 -0.123443             5.0                0.0
    9   10/01/08  0.123440             4.0                1.0
    10  11/01/08 -0.123440             4.0                1.0
    11  12/01/08 -0.123443             4.0                1.0
    12  13/01/08 -0.123440             4.0                1.0
    13  14/01/08 -0.123443             4.0                1.0
    14  15/01/08 -0.123440             5.0                0.0
    15  16/01/08 -0.123443             5.0                0.0
    16  17/01/08 -0.123440             5.0                0.0
    17  18/01/08 -0.123443             5.0                0.0
    18  19/01/08  0.123440             4.0                1.0
    

    注意:在示例数据集中添加几个 0 是值得的,以确保在这种情况下您不会错误地归因它们。 (我们不是,但仍然

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      相关资源
      最近更新 更多