如何从pandas数据帧中的当前行减去前一行,以创建一个新列,用每个名称重新启动进程



我有一个包含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开始(之前的19来自Kirk-Rob的第一个条目中的5(

您应该首先在Name列上使用groupby函数,将diff函数分别应用于每个人。然后,您可以使用fillna(0)NaN值(将存在于每个人的第一行(替换为0:

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

最新更新