如何遍历有条件的列表
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()
我知道这个问题可能有点不适合这个平台,但我无处可求。
我是 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()