хитрая python pandas условная математика с большим количеством пропущенных строк в разных столбцах и возможным повторным индексом - PullRequest
0 голосов
/ 24 февраля 2020

Отображение: существует фрейм данных с большим количеством пропущенных транзакций_total и balance_total и датой

id,date,transaction_total,balance_total
1,01/01/2019,-1,102
1,01/02/2019,-2,100
1,01/03/2019,-3,
1,01/04/2019,,
1,01/05/2019,-4,
2,01/01/2019,-2,200
2,01/02/2019,-2,100
2,01/04/2019,,
2,01/05/2019,-4,

Вот сценарий создания-ввода:

import pandas as pd
import numpy as np

users=pd.DataFrame(
                [
                {'id':1,'date':'01/01/2019', 'transaction_total':-1, 'balance_total':102},
                {'id':1,'date':'01/02/2019', 'transaction_total':-2, 'balance_total':100},
                {'id':1,'date':'01/03/2019', 'transaction_total':-3, 'balance_total':''},
                {'id':1,'date':'01/04/2019', 'transaction_total':'', 'balance_total':''},
                {'id':1,'date':'01/05/2019', 'transaction_total':-4, 'balance_total':''},
                {'id':2,'date':'01/01/2019', 'transaction_total':-2, 'balance_total':200},
                {'id':2,'date':'01/02/2019', 'transaction_total':-2, 'balance_total':100},
                {'id':2,'date':'01/04/2019', 'transaction_total':'', 'balance_total':''},
                {'id':2,'date':'01/05/2019', 'transaction_total':-4, 'balance_total':''}  
                ]
                )

цель - достичь следующее:

желаемый конечный результат:

id,date,balance_total
1,01/01/2019,102
1,01/02/2019,100
1,01/03/2019,97
1,01/04/2019,97
1,01/05/2019,93
2,01/01/2019,200
2,01/02/2019,100
2,01/03/2019,97
2,01/04/2019,97
2,01/05/2019,93

(1), если дата отсутствует, заполните дату балансом с предыдущей даты (я думаю, что решение по переиндексации в этой ссылке могло бы работа Pandas заполнение пропущенных дат и значений в группе )

(2) если Balance_total отсутствует, когда существуют действительные «дата» и «транзакция_total», заполните «итоговое значение баланса» с «balance_total предыдущей даты-транзакции_total на дату, когда Balance_total отсутствует» (случай в строке 3: 100+ (-3) = 97)

(3), если есть действительная дата, но оба параметра transition_total и balance_total имеют значение NaN, просто введите значение Balance_total за последнюю дату (например, строка 4: поскольку итоговый баланс в 01/03/2019 будет равен 97 на основе предыдущего расчета, баланс на 01/04/2019 будет 97, потому что нет транзакции_total.)

желаемый вывод метаданных:

id,date,transaction_total,balance_total
1,01/01/2019,-1,102
1,01/02/2019,-2,100
1,01/03/2019,-3,97
1,01/04/2019,0,97
1,01/05/2019,-4,93
2,01/01/2019,-2,200
2,01/02/2019,-2,100
2,01/03/2019,-3,97
2,01/04/2019,,97
2,01/05/2019,-4,93
...