получить новое значение на основе последней строки и проверить идентификатор - PullRequest
0 голосов
/ 25 апреля 2018

Текущий дата.

ID  Date     Start Value    Payment
111 1/1/2018    1000        0
111 1/2/2018                100
111 1/3/2018                500
111 1/4/2018                400
111 1/5/2018                0
222 4/1/2018    2000        200
222 4/2/2018                100
222 4/3/2018                700
222 4/4/2018                0
222 4/5/2018                0
222 4/6/2018                1000
222 4/7/2018                0

Это тот кадр данных, который я пытаюсь получить.В основном, я пытаюсь заполнить звездное значение для каждой строки.Как видите, каждый идентификатор имеет начальное значение в первый день.начальное значение следующего дня = начальное значение последнего дня - оплата за последний день.

   ID   Date    Start Value     Payment
    111 1/1/2018    1000        0
    111 1/2/2018    1000        100
    111 1/3/2018    900         500
    111 1/4/2018    400         400
    111 1/5/2018    0           0
    222 4/1/2018    2000        200
    222 4/2/2018    1800        100
    222 4/3/2018    1700        700
    222 4/4/2018    1000        0
    222 4/5/2018    1000        0
    222 4/6/2018    1000        1000
    222 4/7/2018    0           0

Сейчас я использую Excel с этой формулой.Начальное значение = if (идентификатор в этой строке == идентификатор в последней строке, начальное значение последней строки - оплата последней строки, начальное значение)

Это работает хорошо, мне интересно, могу ли я сделать это в Python / Pandas,Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2018

Мы можем с помощью groupby и shift + cumsum, ffill установить начальное значение для всех строк с одинаковым Id, тогда нам просто нужно вычесть совокупный платеж из этой строки до начала, мы получаем оставшееся значение в этой точке

df.StartValue.fillna(df.groupby('ID').apply(lambda x : x['StartValue'].ffill()-x['Payment'].shift().cumsum()).reset_index(level=0,drop=True))
Out[61]: 
0     1000.0
1     1000.0
2      900.0
3      400.0
4        0.0
5     2000.0
6     1800.0
7     1700.0
8     1000.0
9     1000.0
10    1000.0
11       0.0
Name: StartValue, dtype: float64

Назначьте обратно, добавив inplace=Ture

df.StartValue.fillna(df.groupby('ID').apply(lambda x : x['StartValue'].ffill()-x['Payment'].shift().cumsum()).reset_index(level=0,drop=True),inplace=True)
df
Out[63]: 
     ID      Date  StartValue  Payment
0   111  1/1/2018      1000.0        0
1   111  1/2/2018      1000.0      100
2   111  1/3/2018       900.0      500
3   111  1/4/2018       400.0      400
4   111  1/5/2018         0.0        0
5   222  4/1/2018      2000.0      200
6   222  4/2/2018      1800.0      100
7   222  4/3/2018      1700.0      700
8   222  4/4/2018      1000.0        0
9   222  4/5/2018      1000.0        0
10  222  4/6/2018      1000.0     1000
11  222  4/7/2018         0.0        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...