【问题标题】:Comparing rows in dataset based on a specific column to find min/max根据特定列比较数据集中的行以找到最小值/最大值
【发布时间】:2021-09-29 23:26:21
【问题描述】:

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

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

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. 我似乎无法根据第一列比较每一行,这将采用第二列中的值并将其包含在临时列表中以执行最小/最大操作?
  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])

【问题讨论】:

    标签: python python-3.x list dataset


    【解决方案1】:

    试试:

    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]
    

    【讨论】:

    • 如果日期的格式为“Wed Jul 21 21:33:34 CDT 2021”,类型为 java.util.date,我只关心月日年,因为比较这仍然有效吗?
    • @Musclemania05 不,您需要先解析日期。看docs.python.org/3/library/datetime.html
    【解决方案2】:

    这是一个使用 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]
    

    【讨论】:

    • 这个答案也是有效的,谢谢
    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2021-07-25
    • 2016-05-14
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多