如何在Python / Pandas中使用“长”格式的数据计算同一列中的值之间的差异

时间:2019-02-05 14:35:37

标签: python pandas pandas-groupby

我有一个按ID排序的长格式数据框。大多数ID具有多于一行,并且所有行都有一个日期。我想计算每个ID内连续行中的日期之间的差异。

我曾尝试在Pandas中使用groupby对象,并将数据转换为宽格式,但没有成功。设置如下。 (对不起,我不知道如何在下面发布设置代码的控制台输出。)

日期列中的整数表示日期。我知道如何处理日期,因此不需要帮助。该代码应计算ID中连续行之间的日期差异,并将差异放在称为“差异”的新列中(即,当到达下一个ID时,应“重新开始”)。每个ID的第一行都不会有差异条目,因为没有要计算的差异。第二个应该是ID中第一行和第二行中日期之间的差,等等。

df = pd.DataFrame({'ID': [1,1,2,2,2,2,3,3,3],
'action': ['first', 'end', 'first', 'change', 'change', 
'last','first','change', 'end'],
'date': [1, 2, 2, 4, 6, 8, 1, 2, 9],
'movement': [1,0,1,1,1,0,1,1,0],})

以下是我的控制台中数据框的图像: Example of Dataframe

用于生成所需输出的代码如下:

desiredOutput = pd.DataFrame({'ID': [1,1,2,2,2,2,3,3,3],
'action': ['first', 'end', 'first', 'change', 'change', 
'last','first','change', 'end'],
'date': [1, 2, 2, 4, 6, 8, 1, 2, 9],
'movement': [1,0,1,1,1,0,1,1,0], 'difference':[0,1,0,2,2,2,0,1,7]})

1 个答案:

答案 0 :(得分:1)

这是一个groupby问题。您可以使用GroupBy.diff,记住用0替换空值并转换为int

df['difference'] = df.groupby('ID')['date'].diff().fillna(0).astype(int)

print(df)

#    ID  action  date  movement  difference
# 0   1   first     1         1           0
# 1   1     end     2         0           1
# 2   2   first     2         1           0
# 3   2  change     4         1           2
# 4   2  change     6         1           2
# 5   2    last     8         0           2
# 6   3   first     1         1           0
# 7   3  change     2         1           1
# 8   3     end     9         0           7