如何在 Pandas 或 Python 中根据某些条件放置项目?

Posted

技术标签:

【中文标题】如何在 Pandas 或 Python 中根据某些条件放置项目?【英文标题】:How to place the items based on some conditions in Pandas or Python? 【发布时间】:2021-12-21 02:40:53 【问题描述】:

我对 python 并不陌生,我在编写一些棘手的代码时面临挑战和错误。如果您能提供帮助,那就太好了:

场景: 我有两个数据集如下: 一种是:

        Location  
    0   loc1   
    1   loc2   
    2   loc3   
    3   loc4    
    4   loc5   
    5   loc6    
    6   loc7   
    7   loc8
    8   loc9...and so on.

还有一个是:

        Item    Rank     Weight
    0   1001    1        18
    1   1002    2        21
    2   1003    3        20
    3   1004    4         7
    4   1005    5        27
    5   1006    6        20
    6   1007    7        11
    7   1008    8        31
    8   1009    9        30
    9   1010    10       23 and so on

我想创建一个函数来根据每个项目的排名和重量为其分配一个插槽。其中排名 1 表示高,而最高的数字表示 100,表示排名最低。

如果排名最高,即我需要将项目放置到第一个位置。以及排名第二高的项目到第二位置,依此类推。但是在放置位置时,我还会检查权重是否超过 25,如果超过 25,那么我不想将它们分配在 loc4、loc5 和 loc6

例如:如果我有 1005 排名为 5 但重量为 27 大于 25,那么我不会将它们放置在 loc4 或 loc5 或 loc6 位置。我会把它放在下一个可用的位置。

预期输出:

        Item    Rank    Weight Location
    0   1001    1        18     loc1 
    1   1002    2        21     loc2
    2   1003    3        20     loc3
    3   1004    4         7     loc4
    4   1005    5        27     loc7
    5   1006    6        20     loc5
    6   1007    7        11     loc6
    7   1008    8        31     loc8
    8   1009    9        30     loc9 
    9   1010    10       23     loc10

请帮忙

【问题讨论】:

为什么 1010 有 loc10 而没有 loc7? @Corralien 因为找到第 9 级项目之后的下一个可用位置是 loc10 对吗?而 1010 排名第 10,这就是为什么 但是 1010 的权重是 23,低于 25,而位置 1008 和 1009 的权重大于 25。我不明白为什么 (1005, 1006, 1007) 与 (1008, 1009, 1010) 大于 25 的重量更重,这就是我不将它们放在 loc4、loc5 和 loc6 上的原因。因为 loc4、loc5、loc6 是机架顶部。而其余的位置不是机架顶部的一部分。这样我就可以放更重的东西了 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

好的,假设您的项目位于 listtuples 中(为了清楚起见,您可能需要使用 namedtuples):

items = [(1001,1,18), (1002,2,21), (1003,3,20), (1004,4,7), (1005,5,27), (1006,6,20), (1007,7,11), (1008,8,31), (1009,9,30), (1010,10,23)]

让我们建立一个位置dict

locations = loc: None for loc in range(1,20)

那么我们只需要知道哪些位置是“顶部”,它们可以接受的最大重量是多少,然后我们开始:

toplocs=[4,5,6]
maxweight = 25

for i in sorted(items, key=lambda x:x[1]):
    if i[2] > maxweight:
        newloc = next(loc for loc,v in locations.items() if v is None and loc not in toplocs)
    else:
        newloc = next(loc for loc,v in locations.items if v is None)
    locations[newloc] = i[0]

【讨论】:

嘿,当我使用 pandas 数据帧而不是元组和列表时,它给我一个错误 如果你想使用 pandas,你必须调整语法——数据帧不是简单的 Python 序列对象(但你仍然可以应用相同的逻辑)

以上是关于如何在 Pandas 或 Python 中根据某些条件放置项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据某些分组列取消pandas数据框? [复制]

如何使用 Pandas 从 Excel 中读取某些列 - Python

Python pandas如何复制某些列

根据条件在Pandas DataFrame中选择行

如何根据字典中的键/值增加 Python Pandas DataFrame

Python,Pandas,数据框 - 拆分和删除单元格的某些部分