嗨,我有一个熊猫df,看起来像以下内容(不是真实数据)
index datedjourney sequence values
1 1 1 120
2 1 1 100
3 1 2 75
4 1 3 50
5 1 3 30
6 1 3 61
7 1 4 40
8 1 4 50
9 2 1 86
10 2 1 40
11 2 2 70
如果我按日期分组并按这样的顺序进行分组
df.groupby(['datedjourney', 'sequence'])['values']
我想计算分组中的最后一行与第二组中的第一行之间的差,以便df
看起来像下面的
index datedjourney sequence values diff_between_groups
1 1 1 120 NaN
2 1 1 100 NaN
3 1 2 75 -25
4 1 3 50 -25
5 1 3 30 NaN
6 1 3 61 NaN
7 1 4 40 -21
8 1 4 50 NaN
9 2 1 86 NaN
10 2 1 40 NaN
11 2 2 70 30.
因此,应该计算第2行和第3行的值,并且应将差值存储在第3行的新列diff_between_groups
中,然后将第3行和第4行之间的差值等等。我不想要计算第8行和第9行之间的差异,因为这是新的datedjourney
。
答案 0 :(得分:1)
创建一个“ diff_between_groups”列,该列是“值”和“值”之间的偏移量的一行。
使用布尔掩码来查找“ datedjourney”相同且“ sequence”与上一行不同的行。
使用pandas Series where函数使用掩码替换“ diff_between_groups”值。
df = pd.DataFrame({'index': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
'datedjourney': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2],
'sequence': [1, 1, 2, 3, 3, 3, 4, 4, 1, 1, 2],
'values': [120, 100, 75, 50, 30, 61, 40, 50, 86, 40, 70]})
df['diff_between_groups'] = df['values'] - df['values'].shift()
mask = (df.datedjourney == df.datedjourney.shift()) & (df.sequence != df.sequence.shift())
df['diff_between_groups'] = df['diff_between_groups'].where(mask, np.nan)
print(df)
index datedjourney sequence values diff_between_groups
0 1 1 1 120 NaN
1 2 1 1 100 NaN
2 3 1 2 75 -25.0
3 4 1 3 50 -25.0
4 5 1 3 30 NaN
5 6 1 3 61 NaN
6 7 1 4 40 -21.0
7 8 1 4 50 NaN
8 9 2 1 86 NaN
9 10 2 1 40 NaN
10 11 2 2 70 30.0