熊猫数据框上的条件迭代

时间:2019-09-29 23:51:32

标签: python pandas for-loop

我正在尝试遍历熊猫数据框,以满足优化任务中的特定条件。

  

让我提供一些背景知识以及我到目前为止所做的一切。

因此,下表是我使用熊猫加载和融化后输入数据的前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乘以每一行各自的决策变量-整个表达式应在特定小时内小于或等于 TotalTask​​atSpecificHour 例如第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

1 个答案:

答案 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