Как вычесть предыдущую строку из текущей строки в кадре данных pandas, чтобы создать новый столбец, перезапускающий процесс с каждым именем? - PullRequest
1 голос
/ 11 июля 2020

У меня есть фрейм данных с 3 столбцами, в которых первый столбец - это категориальная переменная с именем человека, второй столбец - это дата, а третий столбец - совокупные вхождения проблемы. Я хотел бы создать новый столбец с вхождениями по дням на человека.

**Name     Date          Cumulative**

John     01-01-2020    0
John     02-01-2020    5
John     03-01-2020    10
John     04-01-2020    12
Peter    01-01-2020    0
Peter    02-01-2020    3
Peter    03-01-2020    7
Peter    04-01-2020    10
James    01-01-2020    0
James    02-01-2020    10
James    03-01-2020    14
James    04-01-2020    18
Kirk     01-01-2020    0
Kirk     02-01-2020    12
Kirk     03-01-2020    12
Kirk     04-01-2020    15
Rob      01-01-2020    0
Rob      02-01-2020    11
Rob      03-01-2020    18
Rob      04-01-2020    23

Если я использую df ['By Day'] = df.Cumulative.diff (), результат будет хорошим, но в при первом появлении каждого человека он даст мне отрицательное число вместо 0 (потому что оно вычитает предыдущее число до 0). Это дало бы мне следующее:

Name     Date          Cumulative  By Day

John     01-01-2020    0           0
John     01-02-2020    0           0
John     03-01-2020    5           5
John     04-01-2020    10          5
John     05-01-2020    12          2
Peter    01-01-2020    0           -12
Peter    02-01-2020    0           0
Peter    03-01-2020    3           3
Peter    04-01-2020    7           4
Peter    04-01-2020    10          3
James    01-01-2020    0           -10
James    02-01-2020    0           0
James    03-01-2020    10          10
James    04-01-2020    14          4
James    04-01-2020    18          4 
Kirk     01-01-2020    0           -18
Kirk     02-01-2020    0           0
Kirk     03-01-2020    12          12
Kirk     04-01-2020    15          3
Kirk     04-01-2020    19          4
Rob      01-01-2020    5           -14
Rob      02-01-2020    11          6
Rob      03-01-2020    18          7
Rob      04-01-2020    23          5
Rob      04-01-2020    27          4

Я хотел бы сделать различие по каждому имени, чтобы оно начиналось с 0 каждый раз, когда человек не тот. Я думал об использовании итерации по имени, но она будет делать это 5 раз для каждой записи. Например, для Роба я бы хотел 0 6 7 5 4 вместо -14 (предыдущие 19 из Кирка -5 из первой записи Роба)

1 Ответ

1 голос
/ 11 июля 2020

Вы должны сначала использовать функцию groupby в столбце Name, чтобы применить функцию diff отдельно для каждого человека. Затем вы можете использовать fillna(0) для замены значений NaN (которые будут присутствовать в первой строке каждого человека) на 0:

df["By Day"] = df.groupby("Name").Comulative.diff().fillna(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...