【问题标题】:Count values in previous rows that are greater than current row value计算前几行中大于当前行值的值
【发布时间】:2020-10-30 15:22:32
【问题描述】:

我想找到一列中值大于当前行的先前行数的计数,并将其存储在新列中。这就像一个滚动计数,可以追溯到列的开头。下面所需的示例输出显示了给定的值列和我要创建的计数列。

Desired Output:
Value  Count
5      0 
7      0
4      2
12     0
3      4
4      3
1      6

我计划将此代码与大型数据框一起使用,因此不胜感激。

【问题讨论】:

    标签: python pandas loops countif


    【解决方案1】:

    我们可以从numpysubtract.outer,然后得到更低的tri,找到小于0的值,然后对每行的值求和

    a = np.sum(np.tril(np.subtract.outer(df.Value.values,df.Value.values), k=0)<0, axis=1)
    # results in array([0, 0, 2, 0, 4, 3, 6])
    df['Count'] = a
    

    【讨论】:

      【解决方案2】:

      重要提示:这只适用于pandas https://github.com/pandas-dev/pandas/issues/35203 创建了一个问题

      我们可以使用expanding 来做到这一点,并应用一个函数来检查高于扩展数组中最后一个元素的值。

      import pandas as pd
      import numpy as np
      # setup
      df = pd.DataFrame([5,7,4,12,3,4,1], columns=['Value'])
      # calculate countif
      df['Count'] = df.Value.expanding(1).apply(lambda x: np.sum(np.where(x > x[-1], 1, 0))).astype('int')
      

      输入

          Value
      0   5
      1   7
      2   4
      3   12
      4   3
      5   4
      6   1
      

      输出

          Value   Count
      0   5        0
      1   7        0
      2   4        2
      3   12       0
      4   3        4
      5   4        3
      6   1        6
      

      【讨论】:

      • 这段代码对我不起作用,我收到KeyError: -1。我做错了吗?
      • 您创建的数据框是否与“输入”下显示的完全一致?只需尝试执行df.Value.expanding(1).apply(lambda x: x[0]),它应该会给您一个pd.Series,其中所有值都是5。这行得通吗?
      • 是的 x[0] 对我有用,我得到一个包含所有 5 个的系列。但 x[-1] 没有。事实上,即使 x[1] 对我也不起作用
      • 所以df.Value.expanding(1).apply(lambda x: x[-1]) 不起作用?你能用-1索引任何列表吗,例如[1,2,3][-1] 的输出是什么?你用的是哪个python版本?
      • 我更新了我的答案,你能复制粘贴并检查这是否有效吗? [1,2,3][-1] 的结果是什么?
      【解决方案3】:
      count = []   
      for i in range(len(values)):
             count = 0
             for j in values[:i]:
                 if values[i] < j: 
                    count += 1
             count.append(count)
       
      

      【讨论】:

        【解决方案4】:

        下面的生成器将满足您的需求。如果需要,您也许可以进一步优化。

        
        def generator (data) :
            i=0
            count_dict ={} 
            while i<len(data) :
                m=max(data)
                v=data[i] 
                count_dict[v] =count_dict[v] +1 if v in count_dict else 1
                
                t=sum([(count_dict[j] if j in count_dict else 0) for j in range(v+1,m)])
                i +=1
                yield t
        
        d=[1, 5,7,3,5,8]
        foo=generator (d)
        result =[b for b in foo] 
        print(result)
                
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-04
          • 1970-01-01
          相关资源
          最近更新 更多