Python/Pandas实现,用于使用条件和排名进行分组



我想按邮政编码分组并形成褶裥,但如果达到30000,它应该形成另一辆卡车。我无法应用分组并对其进行排名。可能需要按升序对权重进行排序,以形成正确的卡车。如有任何帮助,我们将不胜感激。

我有以下数据:

Load No.  Zip Code  Pounds    
1         50507    20000 
2         50507    8000
3         50507    5000 
4         60001    28000
5         60001    30000
6         60001    2000
7         60001    4000
8         60002    20000
9         60002    18000
10        60002    13000

输出:

Load No.     Zip Code  Pounds    Truck   Total Weight
1         50507    20000     1         28000
2         50507    8000      1         28000
3         50507    5000      2         5000
4         60001    28000     3         30000
5         60001    30000     5         2000
6         60001    2000      3         30000
7         60001    4000      4         4000
8         60002    20000     6         20000
9         60002    18000     7         18000
10        60002    13000     8         13000

我已经对数据帧进行了排序:data=data.sort_values(by=["邮编","磅数"])

还尝试了按邮政编码分组,但未能满足(>20000)形成密集等级的条件:data[总重量]=data.groupby("邮政编码")[磅数]转换(总和)

我想我看到了你想要实现的目标,所以我完成了你想要的一部分,剩下的由你自己决定。这个问题中最困难的部分似乎是智能地分配负载,以最大限度地扩大卡车空间。拆分东西没有问题,但它并不像检查负载是否小于30000那么简单。

首先,一种在卡车之间智能分配负载的方法:

def build_trucks(sorted_loads):
load_copy = np.array(sorted_loads)
truck_max = 30000
# check if any loads are > truck_max and split them into bins that sum to the load
while len(load_copy) > 0:
truck = []
truck_load = 0
for i, load in enumerate(load_copy):
if truck_load + load <= truck_max:
truck.append(i)
truck_load += load
yield load_copy[truck]
load_copy = np.delete(load_copy, truck)

你没有提到是否有负载会超过30000,所以我离开了。这本身就是一个有趣的问题(将45000分成两个负载:30000和15000,将65000分成两个30000和5000)。我对照了一些测试,包括你的测试:

print(list(build_trucks(np.array([20000, 8000, 5000]))))
print(list(build_trucks(np.array([30000, 28000, 4000, 2000]))))
print(list(build_trucks(np.array([20000, 18000, 13000]))))
print(list(build_trucks(sorted(np.array([25000, 1000, 1000, 4000, 5500]), reverse=True))))

输出:

[array([20000,  8000]), array([5000])]
[array([30000]), array([28000,  2000]), array([4000])]
[array([20000]), array([18000]), array([13000])]
[array([25000,  4000,  1000]), array([5500, 1000])]

为了了解这种行为,我运行了:

grp = data.groupby('zip')
for i, g in grp:
print(g.sort_values('pounds', ascending=False))
print()
print(list(build_trucks(g['pounds'])))
print()

其中data是您提供的原始数据的DataFrame。希望问题的剩余部分对你来说变得显而易见。如果没有,请随时询问,我会尽我所能提供帮助(我留下了很多不完整的内容,因为这对你来说是一个很好的学习问题,但我不想在上面花太多时间)。可能有很多方法可以实现这一点,这是我看到的第一种方法。我还想到了一种递归的方法来做到这一点——可能有效,也可能无效。

最新更新