本教程详细阐述了如何在pandas dataframe中高效、可扩展地实现复杂的组内条件赋值逻辑。通过利用`groupby().transform()`结合自定义函数,我们解决了根据商店对工人进行箱子分配的问题,其中包含最大分配量限制和单人商店特殊规则。此方法避免了手动迭代和硬编码`iloc`索引,极大地提升了代码的灵活性和维护性。
在数据处理中,我们经常需要根据特定分组(如本例中的“商店”)对数据进行复杂的条件计算和赋值。本教程的核心任务是为每个商店的工人分配“最优箱子数”(optimal_boxes),遵循以下规则:
我们从以下示例DataFrame开始:
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("原始DataFrame:")
print(df_stack_exchange)期望的输出结果如下:
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()结合一系列if/elif语句来处理不同数量工人的情况。例如:
# 这是一个不可扩展的示例,仅用于说明问题
def box_optimizer_unscalable(x):
if x['optimal_boxes'].count() == 1:
x['optimal_boxes'].iloc[0] = x['boxes'].sum()
return x
elif x['optimal_boxes'].count() == 2:
# 简化逻辑,实际问题中会有更复杂的累加
total_boxes = x['boxes'].sum()
assigned = 0
if total_boxes > 100:
x['optimal_boxes'].iloc[0] = 100
assigned += 100
else:
x['optimal_boxes'].iloc[0] = total_boxes
assigned += total_boxes
remaining = total_boxes - assigned
x['optimal_boxes'].iloc[1] = min(100, remaining) # 假设只剩一个工人
return x
# ... 更多的 elif 条件来处理 count() == 3, 4, ...
return x # 返回未修改的x以防万一
# df_stack_exchange.groupby('store', as_index=False, group_keys=False).apply(box_optimizer_unscalable)这种方法的主要缺点在于:
为了克服上述挑战,我们可以利用Pandas的groupby().transform()方法。transform()的强大之处在于它允许我们对每个组应用一个函数,并返回一个与原始DataFrame具有相同索引和长度的Series或DataFrame,这使得直接将结果赋值回原始DataFrame成为可能。
核心思想是创建一个自定义函数,该函数接收一个组的Series(例如,boxes列的一个子集),并返回一个表示该组内optimal_boxes分配结果的列表或Series。
def assign_boxes(s: pandas.Series) -> list:
"""
根据给定的箱子系列,分配最优箱子数。
遵循每人最多100个箱子,单人商店全部分配的规则。
参数:
s (pandas.Series): 某个商店中所有工人的 'boxes' 列值。
索引顺序即为工人优先级。
返回:
list: 一个列表,包含按优先级分配给每个工人的 'optimal_boxes' 值。
"""
total_boxes_in_store = s.sum() # 计算当前商店的箱子总数
num_workers_in_store = len(s) # 当前商店的工人数量
# 确定可以分配满100个箱子的工人数量 (d)
# 如果是单人商店 (num_workers_in_store == 1),则 len(s)-1 = 0,d 会是 0。
# 这样确保了单人商店的工人会通过 'total_boxes_in_store - 100*d' 获得所有箱子。
d = min(total_boxes_in_store // 100, num_workers_in_store - 1)
# 构建分配结果列表
# 1. 前 d 个工人每人分配 100 个箱子
assigned_list = [100] * d
# 2. 剩余的箱子分配给第 d+1 个工人
remaining_boxes = total_boxes_in_store - (100 * d)
assigned_list.append(remaining_boxes)
# 3. 如果还有多余的工人,但没有箱子可分配,则分配 0
# len(s) - d - 1 是指:总工人数 - 已分配满100箱子的工人 - 获得剩余箱子的工人
assigned_list.extend([0] * (num_workers_in_store - d - 1))
return assigned_list
将assign_boxes函数应用到DataFrame上:
# 初始化DataFrame
df = pandas.DataFrame(data_stack_exchange)
# 对 'store' 列进行分组,然后对 'boxes' 列应用 assign_boxes 函数
# transform 会确保返回的 Series 与原始 df 的索引对齐
df['optimal_boxes'] = df.groupby('store')['boxes'].transform(assign_boxes)
print("\n优化后的Data
Frame:")
print(df)运行上述代码将得到期望的输出结果,并且该方案对不同数量工人的商店具有完全的可扩展性。
我们来深入理解 assign_boxes 函数的逻辑,并通过几个示例进行说明。
示例 1: 商店 A (单人商店)
示例 2: 商店 D (多工人,箱子充足)
通过采用这种基于groupby().transform()的策略,我们成功地实现了一个既高效又高度可扩展的Pandas DataFrame组内条件赋值解决方案,完美应对了复杂的业务规则。
# 编码
# app
# ai
# elif
# pandas
# if
# 封装
# 循环
# len
# append
# transform
# 自定义
# 一名
# 最多
# 将由
# 创建一个
# 最优
# 的是
# 本例
# 这是
# 几个
相关文章:
如何用AWS免费套餐快速搭建高效网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
公司网站设计制作厂家,怎么创建自己的一个网站?
建站之星在线版空间:自助建站+智能模板一键生成方案
建站主机是什么?如何选择适合的建站主机?
开心动漫网站制作软件下载,十分开心动画为何停播?
利用JavaScript实现拖拽改变元素大小
如何在橙子建站上传落地页?操作指南详解
高性能网站服务器部署指南:稳定运行与安全配置优化方案
网站制作公司,橙子建站是合法的吗?
内部网站制作流程,如何建立公司内部网站?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何快速搭建高效香港服务器网站?
如何用PHP快速搭建CMS系统?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
建站之星代理商如何保障技术支持与售后服务?
如何快速搭建自助建站会员专属系统?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
建站之星如何助力企业快速打造五合一网站?
,如何利用word制作宣传手册?
如何零基础在云服务器搭建WordPress站点?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
电商网站制作价格怎么算,网上拍卖流程以及规则?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
Python如何创建带属性的XML节点
怀化网站制作公司,怀化新生儿上户网上办理流程?
如何配置FTP站点权限与安全设置?
如何快速启动建站代理加盟业务?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何在云服务器上快速搭建个人网站?
如何用IIS7快速搭建并优化网站站点?
建站之星北京办公室:智能建站系统与小程序生成方案解析
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何零成本快速生成个人自助网站?
如何选择最佳自助建站系统?快速指南解析优劣
导航网站建站方案与优化指南:一站式高效搭建技巧解析
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
C#怎么使用委托和事件 C# delegate与event编程方法
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何在IIS中新建站点并配置端口与物理路径?
如何在万网自助建站中设置域名及备案?
微信小程序 五星评分(包括半颗星评分)实例代码
建站之星2.7模板:企业网站建设与h5定制设计专题
如何彻底卸载建站之星软件?
如何续费美橙建站之星域名及服务?
如何选择CMS系统实现快速建站与SEO优化?
如何在万网ECS上快速搭建专属网站?
建站168自助建站系统:快速模板定制与SEO优化指南
*请认真填写需求信息,我们会在24小时内与您取得联系。