计算前几行中大于当前行值的值
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】:我们可以从numpy
做subtract.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 在动态添加删除行中计算行值和列值
如何计算行值相对于其他行值的差异总和,特别是使用窗口函数不包括该行