Цикл While не работает при работе с фреймом данных Pandas

#python #pandas #algorithm #while-loop

#python #pandas #алгоритм #цикл while

Вопрос:

Я работаю со следующим dfW фреймом данных (это образец из гораздо большего набора данных):

       bank_id    x_coordinate   y_coordinate   money    time (hr)
725      725   -0.171722    -4.622425      60700    0.720254
5068    5068    0.899443     0.337507        300    1.408178
6618    6618    2.294234     1.146300      21500    1.296493
2455    2455   -0.946596     2.457585      21300    1.276988
166      166    0.687787    -2.578104      24900    1.312164
2450    2450    0.670821    -0.538727       1100    1.282857
6283    6283   -0.099760    -0.822922        600    0.728104
81        81    2.530440    -0.342033        200    1.327394
3920    3920    3.755900    -4.829356        200    0.383559
9877    9877   -2.262354    -0.245852       1700    0.357900
 

С ограничением по времени 3 я пытаюсь подсчитать, сколько денег ( score ) я могу извлечь из банков в df, путешествуя со скоростью 30 км / ч от банка к банку, и df['time hr()'] время, необходимое для ограбления банка.
Поэтому я написал следующий код (это часть более крупной функции, но этого достаточно для моего вопроса):

 import pandas as pd 
import math
bank_list = []
time_left = 3
score = 0
dfW['money/hour'] = dfW['money']/dfW['time (hr)']

while time_left > 1:
    df30k = dfW.loc[dfW['money/hour'] > 30_000]
    df30k.reset_index(drop=True, inplace=True)
    for index, row in df30k.iloc[:-1].iterrows():
        current_position = (df30k["x_coordinate"].iloc[index], df30k["y_coordinate"].iloc[index])
        new_position = (df30k["x_coordinate"].iloc[(index   1)], df30k["y_coordinate"].iloc[(index   1)])
        dist_travelled = math.dist(current_position, new_position)
        travel_time = dist_travelled/30
        rob_time = df30k["time (hr)"].iloc[index]
        time_left -= travel_time
        time_left -= rob_time
        money_collected = df30k["money"].iloc[index]
        score  = money_collected
        bank_id = df30k["id"].iloc[index]
        bank_list.append(bank_id)
    time_left -= df30k["time (hr)"].iloc[-1]
    score  = df30k["money"].iloc[-1]
    bank_list.append(df30k["id"].iloc[-1])
    print(str(time_left) ' hr remains')
score, time_left
 

Когда я запускаю код, я получаю следующий вывод:

 2.2797462995297955 hr remains
1.559492599059591 hr remains
0.8392388985893864 hr remains
(182100, 0.8392388985893864)
 

В то время как я хочу, чтобы код прекращал выполнение, когда time_left>= 1, а затем возвращал результат в это время. Я чувствую, что мне не хватает чего-то основного, но не могу понять это. Любая помощь приветствуется!

Комментарии:

1. итак, вы хотите иметь 1.55 в качестве исходного кода?

2. да, в основном хочу, чтобы он остановился после 1.55 (если это последний раз, когда time_left> 1)

3. адаптируйте мое решение к вашему коду и дайте мне знать

Ответ №1:

Решение

 while True:

    if loop:
    ...
    # outside the if loop
    if time_left - X < 1:
    print(time_left)
    break
 

Адаптируйте его к своему коду.

     if time_left - df30k["time (hr)"].iloc[-1] < 1:
        print((score,time_left))
        break
    time_left -= df30k["time (hr)"].iloc[-1]
    score  = df30k["money"].iloc[-1]
    bank_list.append(df30k["id"].iloc[-1])
    print(str(time_left) ' hr remains')
 

Объяснение

В вашем цикле while вы проверяете, будет ли следующая итерация меньше 1, если да, прервите код и дайте мне текущие значения.

Комментарии:

1. Спасибо за ответ. Просто возник вопрос, хотя, на if time_left - X < 1: что ссылается X? И пойдет ли мой код внутрь if loop: ?

2. X то есть df30k["time (hr)"].iloc[-1] вы хотите указать своему коду проверить, будет ли time_left для следующей итерации меньше 1, прежде чем переходить к следующей итерации.

3. @sak упростил для вас

4. Эй, я наконец-то получил возможность адаптировать его к своему коду и реализовать его! Для конкретного примера, который я привел выше, этот код действительно работает! Однако, когда я использую его для большей функции, я застреваю в бесконечном цикле while, но я думаю, что смогу это понять. Большое спасибо за вашу помощь!

5. Итак, мой больший код — это в основном то, чем я поделился выше, повторенный еще пару раз для банков с разными коэффициентами. Итак, то, чем я поделился, проверяет банки с соотношением деньги / час> 30_000, а моя более крупная функция имеет пару других диапазонов (пытаясь использовать жадный алгоритм, в котором я сначала выбираю банки с самыми высокими коэффициентами и так далее), Так что это тот же код, который просто повторяется еще 2-3 раза для разных коэффициентов