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

How to aggregate last n records of a group object in pandas

是否可以在 pandas 中的组对象的一列的最后 5 条记录中找到空值计数并保存在新列中。假设我们在数据框中有一个组 (00936),其中包含 10 条记录,如下所示。我不想计算 '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

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


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

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

        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

如何在 lambda 函数中移动 tail

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

输出:

      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

怎么样

df['New']=df.code.map((5-df.groupby('code').tail(5).groupby('code')['Obse'].count()))

df
Out[152]: 
      code   months  Obse  New
2903   936  2019-02   4.0    4
2904   936  2019-03   2.0    4
2905   936  2019-04   1.0    4
2906   936  2019-05   NaN    4
2907   936  2019-06   NaN    4
2908   936  2019-07   2.0    4
2909   936  2019-08   NaN    4
2910   936  2019-09   NaN    4
2911   936  2019-10   NaN    4