计算前一行中大于当前行值的值

Count values in previous rows that are greater than current row value

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

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

我计划将此代码与大型数据框一起使用,因此希望能以最快的方式使用。

我们可以从 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
count = []   
for i in range(len(values)):
       count = 0
       for j in values[:i]:
           if values[i] < j: 
              count += 1
       count.append(count)
 

重要提示:这仅适用于 pandas < 1.0.0,错误似乎是 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

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


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)