Условная итерация над фреймом данных Pandas - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь пройтись по фрейму данных pandas, чтобы выполнить определенные условия в задаче оптимизации.

Позвольте мне предоставить некоторые фоны и то, что я сделал до сих пор.

Итак, в таблице ниже приведены мои первые 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

Я с нетерпением жду ваших предложений и помощи.

С уважением

Дива

1 Ответ

0 голосов
/ 30 сентября 2019

вы хотели бы получить возвращаемый столбец * (без часов), по сути вам не нужно применять функцию строка за строкой, но сжимать df по группам, как указано выше, или нарезать: я думаю, что групповая передача - это стандартный способ сделатьэто, но лямбда - ежу понятно.

def fun1(df, Hours, prod):
   return sum(df[df['Hour']==Hours].apply(lambda row:int(row.name)*row['TaskFrequency'],axis=1)) <= prod 
...