如何计算同一列中的值与Python / Pandas中“long”格式的数据之间的差异[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一个按长格式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]})
python pandas pandas-groupby
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.