簡體   English   中英

如何從 pandas dataframe 中的當前行中減去前一行以創建一個新列,以每個名稱重新啟動進程?

[英]How to subtract previous row from current row in a pandas dataframe to create a new column restarting the process with each name?

我有一個 dataframe 有 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 次。 例如,對於 Rob,我想要 0 6 7 5 4 而不是以 -14 開頭(來自 Kirk 的前 19 -5 來自 Rob 的第一個條目)

您應該首先在Name列上使用groupby function 以分別對每個人應用diff function。 然后您可以使用fillna(0)NaN值(將存在於每個人的第一行中)替換為 0:

df["By Day"] = df.groupby("Name").Comulative.diff().fillna(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM