我有一个包含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)