如何在pandas中聚合组对象的最后n条记录

Jio*_*Jio 2 python tail dataframe pandas pandas-groupby

是否可以在 Pandas 中的组对象的列的最后 5 条记录中找到空值计数并保存在新列中。假设我们在一个包含 10 条记录的数据框中有一个组 (00936),如下所示。我不想计算“ Obse”列中的总空值,而只想计算过去 5 个月的空值。而这个计数(即 4.0)我想填写一个新列。

        code    months  Obse
2903    00936   2019-02 4.0
2904    00936   2019-03 2.0
2905    00936   2019-04 1.0
2906    00936   2019-05 NaN
2907    00936   2019-06 NaN
2908    00936   2019-07 2.0
2909    00936   2019-08 NaN
2910    00936   2019-09 NaN
2911    00936   2019-10 NaN

Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 tail 函数,但它不起作用,因为它返回的记录少于组的长度。


df['count_nulls'] = df.groupby('code').tail(5).Obse.transform(lambda group: group.isnull().sum())

Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点。以下是上述输入数据帧的预期输出

        code    months  Obse count_nulls
2903    00936   2019-02 4.0  4.0
2904    00936   2019-03 NaN  4.0
2905    00936   2019-04 1.0  4.0
2906    00936   2019-05 NaN  4.0
2907    00936   2019-06 NaN  4.0
2908    00936   2019-07 2.0  4.0
2909    00936   2019-08 NaN  4.0
2910    00936   2019-09 NaN  4.0
2911    00936   2019-10 NaN  4.0

Run Code Online (Sandbox Code Playgroud)

Qua*_*ang 5

如何tail在 lambda 函数内部移动:

df['count_nulls'] = (df.groupby(['code'])['Obse']
                       .transform(lambda x: x.tail(5).isna().sum())
                    )
Run Code Online (Sandbox Code Playgroud)

输出:

      code   months  Obse  count_nulls
2903   936  2019-02   4.0          4.0
2904   936  2019-03   2.0          4.0
2905   936  2019-04   1.0          4.0
2906   936  2019-05   NaN          4.0
2907   936  2019-06   NaN          4.0
2908   936  2019-07   2.0          4.0
2909   936  2019-08   NaN          4.0
2910   936  2019-09   NaN          4.0
2911   936  2019-10   NaN          4.0
Run Code Online (Sandbox Code Playgroud)