name date value
a 1/1/2011 3
b 1/1/2011 5
c 1/1/2011 7
a 1/2/2011 6
b 1/2/2011 10
c 1/2/2011 14
我这里有一个 df,其中的值是累积统计数据。所以 name: a date: 1/2/2011 的实际值是 3 而不是 6。要获得特定日期的实际值,我需要取当天的值减去前一天的值。我想计算每个日期每个名称的实际值。类似于 df.groupby(['name', 'date'])['value'].diff() 但此代码返回错误。
最终我需要的是
name date actual value
a 1/1/2011 3
b 1/1/2011 5
c 1/1/2011 7
a 1/2/2011 3
b 1/2/2011 5
c 1/2/2011 7
请您参考如下方法:
这可以在一行中以矢量化的方式完成。
import pandas as pd
df = pd.read_clipboard() # Reading from your question
df['value'] = df.groupby('name')['value'].diff(1).fillna(df['value'])
正如评论中所讨论的,在应用 fillna 以正确替换 NaN 值时,有必要引用原始的 'values 系列来自 diff(这发生在 'name' 中每个标签的第一个实例)。
