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

Posted

技术标签:

【中文标题】计算前几行中大于当前行值的值【英文标题】: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

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

【问题讨论】:

【参考方案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)
        

【讨论】:

以上是关于计算前几行中大于当前行值的值的主要内容,如果未能解决你的问题,请参考以下文章

计算不同行和列的值的差值

使用 Javascript 在动态添加删除行中计算行值和列值

MySQL:用其他行值计算和更新一行?

如何计算行值相对于其他行值的差异总和,特别是使用窗口函数不包括该行

在 Spark DataFrame 中计算大于 0 的值的更快方法?

如何计算与 R 中相同列值关联的两个行值的差异?