用条件分组和排序的Python/Pandas实现

2024-04-29 05:51:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按邮政编码分组,形成塔克,但如果它达到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.sort\u值(按=['邮政编码','英镑'])

还尝试按邮政编码分组,但未能将条件(>;20000)设置为密集等级: 数据['总重量']=数据.groupby('Zip Code')['Pounds'].transform(总和)


Tags: 数据nodata排序codeloadziptotal
1条回答
网友
1楼 · 发布于 2024-04-29 05:51:14

我想我看到了你想要完成的,所以我完成了你想要的部分,剩下的留给你自己决定。这个问题中最困难的部分似乎是智能地分配负载以最大化卡车空间。把东西分开是没有问题的,但这并不像检查负载是否少于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是您提供的原始数据的数据帧。希望剩下的问题对你来说变得明显。如果没有,请尽管问,我会尽我最大的努力来帮助你(我留下了很多不完整的东西,因为这对你来说是一个很大的学习问题,但是我不想花太多的时间在上面)。可能有很多方法可以做到这一点,这是我看到的第一种方法。我还想到了一种递归的方法来实现这一点,可能有效,也可能无效。你知道吗

相关问题 更多 >