我正在尝试遍历熊猫数据框,以满足优化任务中的特定条件。
让我提供一些背景知识以及我到目前为止所做的一切。
因此,下表是我使用熊猫加载和融化后输入数据的前10行(名为df_long
)的示例。我的实际数据集中有150行。
Hour TypeofTask TaskFrequency TotalTaskatSpecific Hour
0 08 A 5 50
1 09 D 8 30
2 08 D 7 50
3 10 C 4 20
4 09 B 6 30
5 08 B 9 50
6 10 A 2 20
7 09 D 1 30
8 08 C 3 50
9 08 E 2 50
10 09 A 7 30
我还使用以下循环语句为上述输入数据集的每一行创建了决策变量,即x0,x1,x2,..... xn;
decision_variables = []
for rownum, row in df_long.iterrows():
variable = str('x' + str(rownum))
variable = pulp.LpVariable(str(variable), lowBound = 0, cat= 'Integer')
decision_variables.append(variable)
我的实际问题。
我希望能够遍历熊猫数据框以找到在特定时间发生的所有 TaskFrequency ,然后将每个TaskFrequency乘以每一行各自的决策变量-整个表达式应在特定小时内小于或等于 TotalTaskatSpecificHour 例如第10小时的表达式如下:
4*x3 + 2*x6 <= 20
到目前为止,我已经能够做到这一点:
to = ""
for rownum, row in df_long.iterrows():
for i, wo in enumerate(decision_variables):
if rownum == i:
formula = row['TaskFrequency']*wo
to += formula
prob += to
这给了我:
5*x0 + 8*x1 + 7*x2 + 4*x3 + 6*x4 + 9*x5 + 2*x6 + 1*x7 +3*x8 + 2*x9 + 7*x10
我也尝试过:
for rownum, row in df_long.iterrows():
for i, wo in enumerate(decision_variables):
for x,y,z in zip(df_long['Hour'],df_long['TypeofTask'],df_long['TaskFrequency']):
if rownum == i:
formula1 = row['TaskFrequency']*wo
我刚得到7 * x10
我希望得到的是相同的表达方式,但要针对特定的小时,而不是整个过程,例如 对于10小时,应该是
4*x3 + 2*x6 <= 20
第9小时应该是
8*x1 + 6*x4 + 1*x7 + 7*x10 <= 30
我期待您的建议和帮助。
致谢
Diva
答案 0 :(得分:0)
您将需要一个返回列*(无时间),本质上您不需要逐行应用函数,而是像上面的答案那样通过groupby压缩df或切片: 我认为groupby是实现此目的的标准方法,但是lambda毫不费力。
def fun1(df, Hours, prod):
return sum(df[df['Hour']==Hours].apply(lambda row:int(row.name)*row['TaskFrequency'],axis=1)) <= prod