Подсчитать значения в предыдущих строках, которые больше, чем значение текущей строки - PullRequest
2 голосов
/ 10 июля 2020

Я хочу найти счетчик количества предыдущих строк, которые имеют большее значение, чем текущая строка в столбце, и сохранить его в новом столбце. Это было бы как вращающийся счетчик, возвращающийся в начало столбца. В приведенном ниже желаемом примере выходных данных показан столбец значений и столбец, который я хочу создать.

Ответы [ 4 ]

4 голосов
/ 10 июля 2020

Мы можем сделать subtract.outer из numpy, затем получить меньшую тройку и найти значение меньше 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
1 голос
/ 10 июля 2020

ВАЖНО: это работает только с pandas <1.0.0, и ошибка кажется ошибкой pandas. Проблема уже создана в <a href="https://github.com/pandas-dev/pandas/issues/35203" rel="nofollow noreferrer">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
0 голосов
/ 10 июля 2020

Указанный ниже генератор сделает то, что вам нужно. При необходимости вы сможете оптимизировать его.


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)
        
0 голосов
/ 10 июля 2020
count = []   
for i in range(len(values)):
       count = 0
       for j in values[:i]:
           if values[i] < j: 
              count += 1
       count.append(count)
 
...