根据特定列比较数据集中的行以查找 min/max

Comparing rows in dataset based on a specific column to find min/max

所以我有一个 dataset,其中包含特定标签从开始日期到结束日期的历史记录。我正在尝试根据日期列比较行,如果它们在月、日和年方面相似,我将通过下一列的值将它们添加到临时列表中,然后一旦我通过类似的方式获得这些项目日期,我将获取该列表并找到 min/max 值减去它们,然后将结果添加到另一个列表并清空 temp_list 以重新开始。

为了时间和简单起见,我只提供一个二维列表的例子。这是我的示例数据

dataset = [[1,5],[1,6],[1,10],[1,23],[2,4],[2,8],[2,12],[3,10],[3,20],[3,40],[4,50],[4,500]]

第一列将充当 dates,第二列将充当 value

我遇到的问题是:

  1. 我似乎无法根据第一列比较每一行,这将采用第二列中的值并将其包含在临时列表中以执行 min/max 操作?
  2. 基于上面的二维列表,我希望得到 [18,8,30,450] 但结果是 [5,4,10]
dataset = [[1,5],[1,6],[1,10],[1,23],[2,4],[2,8],[2,12],[3,10],[3,30],[3,40],[4,2],[4,5]]
temp_list = []
daily_total = []
for i in range(len(dataset)-1):
    if dataset[i][0] == dataset[i+1][0]:
        temp_list.append(dataset[i][1])
    else:
        max_ = max(temp_list)
        min_ = min(temp_list)
        total = max_ - min_
        daily_total.append(total)
        temp_list = []
            
print([x for x in daily_total])

尝试:

tmp = {}
for d, v in dataset:
    tmp.setdefault(d, []).append(v)

out = [max(v) - min(v) for v in tmp.values()]
print(out)

打印:

[18, 8, 30, 450]

这是一个使用 pandas 的解决方案:

import pandas as pd

dataset = [
    [1, 5],
    [1, 6],
    [1, 10],
    [1, 23],
    [2, 4],
    [2, 8],
    [2, 12],
    [3, 10],
    [3, 20],
    [3, 40],
    [4, 50],
    [4, 500],
]

df = pd.DataFrame(dataset)
df.columns = ["date", "value"]
df = df.groupby("date").agg(min_value=("value", "min"), max_value=("value", "max"))
df["res"] = df["max_value"] - df["min_value"]
df["res"].to_list()

输出:

[18, 8, 30, 450]