Как реплицировать ранг окна SQL в Python - PullRequest
1 голос
/ 09 июля 2019

Если предположить, что у меня есть входной набор данных (список списков) с идентификатором, данными и значением оценки, и я хотел бы отфильтровать до самого высокого дня оценки для каждого идентификатора.Обычно в SQL я делаю это с помощью функции окна и ранга, но я не могу придумать Pythonic способ приближения к этому.

Вот нативное решение:

data = [
    ["123", "11/11/11", "0.5"],
    ["555", "12/11/11", "0.3"],
    ["555", "13/11/11", "0.9"],
    ["123", "14/11/11", "0.8"]
]
_sorted = sorted( data, key=lambda record: (record[0], record[2]), reverse=True)

output = []

last_id_seen = None
for record in _sorted:
    if record[0] is last_id_seen:
        continue
    last_id_seen = record[0]
    output.append(record)
print(output)

# output
# [['555', '13/11/11', '0.9'], ['123', '14/11/11', '0.8']]

Но эточувствует себя неуклюже, и я не знаю, насколько хорошо этот сорт будет поддерживать более сложную ситуацию.Также в идеале я бы хотел избежать решения Pandas или Numpy, так как не думаю, что они здесь нужны.

Предложения?

1 Ответ

2 голосов
/ 09 июля 2019
data = [
    ["123", "11/11/11", "0.5"],
    ["555", "12/11/11", "0.3"],
    ["555", "13/11/11", "0.9"],
    ["123", "14/11/11", "0.8"]
] # data 

from itertools import groupby # groupby function
# Sort on id and score
_sorted = sorted( data, key=lambda record: (record[0], record[2]), reverse=True)

for k, v in groupby(_sorted, lambda x: x[0]): # group by id
    # k: ids, v: groups
    print(list(v)[0]) # print

Я использовал groupby из itertools для группировки отсортированного массива по столбцу ID.Поскольку у нас есть обратный порядок для ключа счета, достаточно получить первый элемент v[0] каждой группы.

...