如何复制 SQL window 在 python 中的排名
How to replicated SQL window rank in python
如果我们假设我有一个包含 ID、数据和分值的输入数据集(列表列表),我想过滤出每个 ID 的最高分日。
通常在 SQL 中,我会使用 window 和 rank 函数来做到这一点,但我想不出一种 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 解决方案,因为我认为这里不需要它们。
建议?
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 列上的排序数组进行分组。由于我们在 score key 上有相反的顺序,所以获取每个组的第一个元素 v[0]
就足够了。
如果我们假设我有一个包含 ID、数据和分值的输入数据集(列表列表),我想过滤出每个 ID 的最高分日。 通常在 SQL 中,我会使用 window 和 rank 函数来做到这一点,但我想不出一种 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 解决方案,因为我认为这里不需要它们。
建议?
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 列上的排序数组进行分组。由于我们在 score key 上有相反的顺序,所以获取每个组的第一个元素 v[0]
就足够了。