Изменение значений значений строк при переборе данных - PullRequest
0 голосов
/ 01 марта 2019

У меня есть этот dataframe test_data:

  Deal    Year    Month     Billing   Running_total   payment    over_payment

2   A      2018   December  21167.99    21167.99      1270.08       0.00
3   A      2018   December  -3184.59    17983.40     -1270.08       0.00
4   A      2019   January   1855.10     19838.50      0.00      -1270.08
5   A      2019   February  400.00      20238.50      0.00          0.00
6   A      2019   March     600.00      20838.50      0.00          0.00
7   A      2019   April     1000.00     21838.50      0.00          0.00

Я хочу продолжить передачу отрицательной суммы в переплате до следующей строки, пока 6% от Running_total меньше абсолютного значения -1270до тех пор, пока 6% от значения Running_total не станет больше или равно абсолютному значению over_payment, тогда установите значение over_payment равным 0. Я должен выполнить приведенный ниже код четыре раза, прежде чем получу правильный вывод, я думаю, что это должно бытьпроблема с установкой в ​​следующей строке значения over_payment до того, как итерация достигнет этого индекса #. Я пытаюсь сделать это на уровне «Сделка», поэтому я включил условие, когда имя следующей сделки должно быть равно текущемуодин, поэтому он не переносится, например, на сделку "B", а только вносит изменения в соответствующую сделку.

Вот что я пробовал:

 for index, row in test_data.iterrows():
   if row['over_payment'] <0:
     if (row['Running_Total'] * .06)>abs(row['over_payment']):
       test_data.at[index, 'over_payment']= 0
       test_data.at[index, 'Rebate']= (row['Running_Total'] * .06) + (row['over_payment'])

     elif (row['Running_Total'] * .06)< abs(row['over_payment']):
       next_index= str(int(index) + 1)
       last_index= str(int(index) - 1)
       if test_data.at[index, 'Deal'] ==test_data.at[next_index, 'Deal']:
         test_data.at[next_index, 'over_payment'] = test_data.at[index, 'over_payment']
       else:
         test_data.at[index, 'over_payment'] = test_data.at[last_index, 'over_payment']

Желаемый результат:

Deal      Year    Month     Billing   Running_total   payment    over_payment

2   A      2018   December  21167.99    21167.99      1270.08       0.00
3   A      2018   December  -3184.59    17983.40      -1270.08      0.00
4   A      2019   January   1855.10     19838.50       0            -1270.08
5   A      2019   February  400.00      20238.50       0            -1270.08
6   A      2019   March     600.00      20838.50       0            -1270.08
7   A      2019   April     1000.00     21838.50       40.23            0

1 Ответ

0 голосов
/ 01 марта 2019

Вот метод, который получает желаемый ответ за одну попытку:

for deal in test_data.Deal.unique():
    over_payment = 0  # reset for each deal
    for idx, row in test_data[test_data.Deal == deal].iterrows():
        if row.over_payment < 0:
            over_payment = row.over_payment
        elif over_payment < 0:
            if row.Running_total * 0.06 < abs(over_payment):
                test_data.loc[idx, 'over_payment'] = over_payment
            else:
                over_payment = 0

Здесь делается несколько предположений.Во-первых, индекс уникален.Второе - это данные в порядке даты.И то, и другое легко управляется, вам просто нужно знать о них.

Также я не вижу, что вы делаете с 'Rebate', поскольку этого нет в вашем желаемом выходе.Я также не знаю, с чем у вас проблемы, когда вы смотрите вперед и назад.Я избежал этого, работая по одной строке за раз и просто сохраняя состояние последней строки, сбрасывая ее по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...