You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Pandas数据框非零项在Pyomo中生成二进制变量?

解决方案

先筛选出数据框中数值大于0的所有(列, 行)对,再用这些配对作为变量的索引集合,就能避免生成多余变量。以下是两种简洁实现方式:

方法一:利用stack()和布尔筛选

import pandas as pd
from pyomo.environ import ConcreteModel, Var, Binary

df = pd.read_csv(...)
# 筛选出所有值>0的(行, 列)对,转换为(列, 行)的顺序
valid_pairs = [(col, row) for row, col in df.stack()[df.stack() > 0].index]

model = ConcreteModel()
# 仅为有效配对创建二进制变量
model.myVars = Var(valid_pairs, within=Binary, name="myVars")

方法二:用where()简化筛选逻辑

import pandas as pd
from pyomo.environ import ConcreteModel, Var, Binary

df = pd.read_csv(...)
# where将<=0的值设为NaN,stack自动剔除NaN,直接获取有效(行,列)对,再转顺序
valid_pairs = [(col, row) for row, col in df.where(df > 0).stack().index]

model = ConcreteModel()
model.myVars = Var(valid_pairs, within=Binary, name="myVars")

补充说明

  • stack()会把数据框转换为Series,索引变为(行, 列)格式的MultiIndex,方便直接提取有效配对
  • 两种方法都只保留df[c][r] > 0的(列,行)对作为变量索引,完全避免生成不必要的二进制变量
  • 如果需要保持(行,列)的索引顺序,直接去掉列表推导里的顺序转换即可

内容的提问来源于stack exchange,提问作者ahul-fell-awen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:32:06