Pandas / Python комплекс, условная сумма - PullRequest
0 голосов
/ 16 октября 2018

df_have

CONTRACT ID  AMT     REL_NUM HDR_NUM
1         1   0.00    0      1    
1         2   33.85   1      2    
1         3   0.72    2      2    
1         4   0.87    1      1    
1         5   1.67    1      2  

df_want

CONTRACT ID  AMT     REL_NUM HDR_NUM CALCULATION
1         1   0.00    0      1        (0.00+33.85+0.87+1.67)
1         2   33.85   1      2        (33.85+0.72)
1         3   0.72    2      2        (33.85+0.72)
1         4   0.87    1      1        (0.00+33.85+0.87+1.67)
1         5   1.67    1      2        (33.85+0.72)

df_getting

CONTRACT ID  AMT     REL_NUM HDR_NUM CALCULATION
1         1   0.00    0      1        21.75
1         2   33.85   1      2        2.00
1         3   0.72    2      2        19.75
1         4   0.87    1      1        33.85
1         5   1.67    1      2        0.00

Попытка создать новый столбец 'CALCULATION', но логика немного сложная.Вычисление должно быть SUM поля AMT, зависящего от полей CONTRACT, ID, REL_NUM и HDR_NUM.

Шаг 1- Проверьте поле HDR_NUM и получите соответствующее значение AMT, где ID = HDR_NUM И поле CONTRACTтот же

Шаг 2 - Добавьте во все поля AMT, где REL_NUM = HDR_NUM для того же КОНТРАКТА

Для первой строки, это будет суммирование полей AMT для ID = 2,3 и4 для КОНТРАКТА = 1.Для строки 6 это будет суммирование полей AMT для ID = 2,4 для CONTRACT = 2

Одно предостережение: двойного счета не должно быть (т.е. для строки 6 суммируйте поля AMT для ID = 2, 4 для КОНТРАКТА = 2, не удваивайте счет ID = 2)

1 Ответ

0 голосов
/ 16 октября 2018

IIUC,

def F(s):
    rule1   = s[['ID', 'AMT']].set_index('ID').to_dict()['AMT']
    rule2   = s[['REL_NUM', 'AMT']].groupby('REL_NUM').sum().to_dict()['AMT']
    s1 = s['HDR_NUM'].astype(int).map(rule1).fillna(0)
    s2 = s['HDR_NUM'].astype(int).map(rule2).fillna(0)
    return s1 + s2

df['CALCULATION'] = df.groupby('CONTRACT').apply(F).values.ravel()


    CONTRACT    ID  AMT     REL_NUM HDR_NUM CALCULATION
0   1           1   0.00    0       1       36.39
1   1           2   33.85   1       2       34.57
2   1           3   0.72    2       2       34.57
3   1           4   0.87    1       1       36.39
4   1           5   1.67    1       2       34.57
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...