我有一个按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],})
以下是我的控制台中数据框的图像:
用于生成所需输出的代码如下:
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]})
答案 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