我有以下数据框:
id subid a
1 1 1 2
2 1 1 10
3 1 1 20
4 1 2 30
5 1 2 35
6 1 2 36
7 1 2 40
8 2 2 20
9 2 2 29
10 2 2 30
例如,我想在“a”列上应用pandas diff()函数,但是只要“id”或“subid”被更改,并且希望将值存储在新列中,就应该重新应用该函数。
下面是我期望的df。
id subid a difference
1 1 1 2 NaN
2 1 1 10 8
3 1 1 20 10
4 1 2 30 NaN
5 1 2 35 5
6 1 2 36 1
7 1 2 40 4
8 2 2 20 NaN
9 2 2 29 9
10 2 2 30 1
正如在第4行和第8行可以观察到的那样,“id”或“subid”正在变化,因此存在NaN值,并且在连续的行中计算diff。
使用过
df["difference"] = df["a"].diff()
这显然适用于整个列,而不是预期的方式。我试过使用groupby,但不知怎么的,它给了额外的行。
谢谢你事先的建议。
最佳答案
这是个棘手的问题。根据您的确切措辞,您希望在'id'
或'subid'
更改的每个点重置。这意味着即使它们来回变化。
此外,如果在diff
上下文中进行groupby
计算,则不会有任何影响,因此我将提前计算并在情况发生变化时屏蔽它。
i = df.id.values
s = df.subid.values
i_chg = np.append(False, i[:-1] != i[1:])
s_chg = np.append(False, s[:-1] != s[1:])
df.assign(difference=df.a.diff().mask(i_chg | s_chg))
id subid a difference
1 1 1 2 NaN
2 1 1 10 8.0
3 1 1 20 10.0
4 1 2 30 NaN
5 1 2 35 5.0
6 1 2 36 1.0
7 1 2 40 4.0
8 2 1 20 NaN
9 2 1 29 9.0
10 2 1 30 1.0