猿问

如何从 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 开始(Kirk 的前 19 -5 来自 Rob 的第一个条目)


慕盖茨4494581
浏览 121回答 1
1回答

元芳怎么了

您应该首先在该列上使用groupby函数Name以分别对每个人应用该diff函数。然后你可以使用0fillna(0)替换NaN值(将存在于每个人的第一行):df["By Day"] = df.groupby("Name").Comulative.diff().fillna(0)
随时随地看视频慕课网APP

相关分类

Python
我要回答