我有以下数据框:

       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

08-27 18:32