利用Pandas实现数据框分组条件分配的自动化与优化

admin 百科 13

利用Pandas实现数据框分组条件分配的自动化与优化

本文详细介绍了如何在pandas数据框中,以可扩展的方式根据分组条件(如商店和工人)自动化分配“箱子”数量。通过`groupby().transform()`结合自定义函数,实现了为每个工人分配最多100个箱子,并处理了单人商店的特殊情况,避免了手动`iloc`索引的不可伸缩性,显著提升了数据处理效率和代码的健壮性。

引言

在数据处理和资源分配场景中,我们经常需要根据特定规则将总量分配给不同的实体。一个常见需求是,在分组数据中,按照优先级为每个组内成员分配资源,并遵循最大容量限制,同时可能存在特殊情况(例如,当组内成员数量为一时)。手动处理这些分配逻辑,特别是当组规模或组数量庞大时,会变得极其繁琐且难以维护。本教程将展示如何利用Pandas的强大功能,特别是groupby().transform()方法,以一种高效、可扩展且易于理解的方式解决此类问题。

问题描述与传统方法的局限性

假设我们有一个包含商店、工人、工人拥有的箱子数量以及待分配的“最优箱子”数量的数据框。我们的目标是根据以下规则填充optimal_boxes列:

  1. 工人优先级按其worker编号的数值顺序。
  2. 每个工人最多分配100个箱子。
  3. 如果一个商店只有一个工人,则该工人获得该商店所有箱子的总和,即使超过100个。
  4. 箱子总量从优先级最高的工人开始分配,直到分配完毕或所有工人均达到最大容量。

以下是示例数据框:

import pandas
import numpy

data_stack_exchange = {'store': ['A','B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D'],
        'worker': [1,1,2,1,2,3,1,2,3,4],
        'boxes': [105, 90, 100, 80, 10, 200, 70, 210, 50, 0],
        'optimal_boxes': [0,0,0,0,0,0,0,0,0,0]}
df_stack_exchange = pandas.DataFrame(data_stack_exchange)

print("原始数据框:")
print(df_stack_exchange)

登录后复制

原始的数据框如下:

  store  worker  boxes  optimal_boxes
0     A       1    105              0
1     B       1     90              0
2     B       2    100              0
3     C       1     80              0
4     C       2     10              0
5     C       3    200              0
6     D       1     70              0
7     D       2    210              0
8     D       3     50              0
9     D       4      0              0

登录后复制

预期的结果数据框如下:

  store  worker  boxes  optimal_boxes
0     A       1    105            105
1     B       1     90            100
2     B       2    100             90
3     C       1     80            100
4     C       2     10            100
5     C       3    200             90
6     D       1     70            100
7     D       2    210            100
8     D       3     50            100
9     D       4      0             30

登录后复制

一个常见的初学者方法是使用groupby().apply()结合条件判断和手动iloc索引来处理每个组。然而,这种方法存在严重缺陷:它要求针对不同组大小编写冗长的if/elif语句,并且在每个分支中手动指定iloc索引。这不仅导致代码重复,而且当组大小增加时,代码将变得难以维护和扩展。

优化方案:利用 groupby().transform() 实现可扩展分配

为了解决上述问题,我们可以设计一个更通用的函数,该函数能够处理任意大小的组,并利用pandas.groupby().transform()方法将结果高效地应用回原始数据框。transform()方法特别适用于此类场景,因为它要求自定义函数返回一个与输入组具有相同索引和长度的Series或DataFrame,从而可以直接将结果映射回原始数据框的相应位置。

利用Pandas实现数据框分组条件分配的自动化与优化-第2张图片-佛山资讯网

核心分配逻辑函数

我们将创建一个名为assign_boxes的函数,它接收一个Pandas Series(代表一个商店中所有工人的boxes列),并返回一个列表,其中包含每个工人应获得的optimal_boxes数量。

标签: app 区别 elif

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~