如何遍历有条件的列表

how to iterate over a list with condition

我知道这个问题可能有点不适合这个平台,但我无处可求。

我是 python 的新手,我正在尝试学习如何在某些条件下迭代列表。我有下一个问题 - 对于每个独特的 link 从哪里到哪里,我想选择最赚钱的供应商之一。有利可图的供应商是一周中大部分时间都比其他供应商更便宜(即成本更低)的供应商。数据集如下,其中列为:一周中的第 1 天、第 2 天、第 3 天、第 4 位供应商编号、第 5 位成本。

为了解决这个任务,我决定首先创建一个新的列和具有独特路线的列表。

df_routes['route'] = df_routes['From'] + '-' + df_routes['Where']
routes = df_routes['route'].unique()
len(routes)

然后遍历它,但我不完全理解结构应该是什么样子。我的猜测是它应该是这样的:

for i, route in enumerate(routes):
    x = df_routes[df_routes['route'] == route]
    if x['supplier'].nunique() == 1:
        print(route, supplier)
    else:
...

我不知道如何进一步构建它,也不知道这是否是正确的结构。那么它应该是什么样子呢?

对于这个问题的任何帮助(技巧、提示、代码片段),我将不胜感激。

使用 pandas 函数而不是循环

可以更有效地解决这个问题

df 成为前两条路线的数据框的一部分。首先,我们按成本排序,然后按路线和 'Day' 分组。这将告诉我们每天和每条路线哪个供应商最便宜:

df1 = df.sort_values('Cost', ascending = True).groupby(['From','To', 'Day']).first()

df1 看起来像这样:

            Supplier    Cost
From To Day     
BGW MOW 1   3   75910
        2   3   75990
        3   3   27340
        4   3   75990
        5   11  19880
        6   3   75440
        7   11  24740
OSS UUS 1   47  65650
        2   47  47365
        3   47  70635
        4   47  47365
        5   47  62030
        6   47  62030
        7   47  71010

接下来我们计算每条路线的每个供应商的提及次数:

df2 = df1.groupby(['From','To'])['Supplier'].value_counts().rename('days').reset_index(level=2)

df2 看起来像这样:


        Supplier    days
From To     
BGW MOW 3           5
    MOW 11          2
OSS UUS 47          7  

例如,对于第一条路线,供应商 3 有 5 天最便宜,供应商 11 有 2 天

现在我们只为每条路线选择第一个(most-mentioned)供应商:

df3 = df2.groupby(['From','To']).first()

df3 是最终输出,如下所示:


        Supplier    days
From To     
BGW MOW 3           5
OSS UUS 47          7

Groupby 数据框基于列 (['From','To', 'Day']) 并使用聚合 min ('Cost')

获取结果的函数

df.groupby(['From','To', 'Day']).min('Cost').reset_index()