计算前一行中大于当前行值的值
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
我计划将此代码与大型数据框一起使用,因此希望能以最快的方式使用。
我们可以从 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
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)
我想计算某列中值大于当前行的前几行的数量,并将其存储在新列中。这就像一个可以追溯到列开头的滚动计数。下面所需的示例输出显示了给定的值列和我要创建的计数列。
Desired Output:
Value Count
5 0
7 0
4 2
12 0
3 4
4 3
1 6
我计划将此代码与大型数据框一起使用,因此希望能以最快的方式使用。
我们可以从 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
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)