python - 如何在Python中复制SQL窗口排名

标签 python ranking

如果我们假设我有一个包含 id、数据和得分值的输入数据集(列表列表),我想过滤到每个 id 的最高得分日。 通常在 SQL 中,我会使用窗口和排名函数来完成此操作,但我想不出一种 Pythonic 方法来实现此目的。

这是一个 native 解决方案:

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 解决方案,因为我认为这里不需要它们。

建议?

最佳答案

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

我使用了 itertools 中的 groupby 对 ID 列上的排序数组进行分组。由于我们对分数键有相反的顺序,因此获取每组的第一个元素 v[0] 就足够了。

关于python - 如何在Python中复制SQL窗口排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56945886/

相关文章:

Python Pandas : dynamic concatenation from get_dummies

python - 如何将字符串转换为纯文本?

python - 比较两个 Python Pandas 数据帧的 2 列并获取公共(public)行

algorithm - 列表排序算法

python - 在 postgresql 中作为查询执行时,Django ORM 查询失败

python - 添加列不同长度的 Pandas

php - 计算来自 2 个不同表的总条目数

python - 查找具有给定排名的所有固定长度的子数组

php - Symfony/Doctrine 排名

algorithm - 基于 Upvotes 和 Views 的排名算法,没有 downvotes