获得每组最大连续的空值总和

时间:2017-08-23 10:41:13

标签: python pandas

我有一个Dataframe df,如下所示:

col1      col2      col3      col4

 A         A     2017-07-18     2
 A         A     2017-07-25    NaN
 A         A     2017-08-01    NaN
 A         A     2017-08-08    NaN
 A         B     2017-07-18    NaN
 A         B     2017-07-25    2.75
 A         B     2017-08-01    NaN
 A         B     2017-08-08    NaN
 B         B     2017-07-18    3.25
 B         B     2017-07-25    3.34
 B         B     2017-08-01    3.58
 B         B     2017-08-08    3.25
 B         D     2017-07-18    1.28
 B         D     2017-07-25    2.34
 B         D     2017-08-01    NaN
 B         D     2017-08-08    2.65
 B         D     2017-08-15    2.63

现在,我想创建一个新的数据帧df2,它将显示col1和col2以及一个新列,它将计算df.col4中连续NaN的最大数量。我想要的结果就是这样:

col1     col2      new_col

  A        A          3
  A        B          2
  B        B          0
  B        D          1

我试图做的是使用shift()和一些布尔掩码来获取我有多于或等于2个连续空值的行,但是我得到的结果数据帧远不及我正在尝试的那样实现。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

有点令人费解的方式,因为你无法NaN进行shift平等检查,我们会创建一个临时的isnull

In [827]: (df.assign(null=df.col4.isnull()).groupby(['col1', 'col2'])
             .null
             .apply(lambda x: (
                    x * (x.groupby((x != x.shift()).cumsum()).cumcount() + 1)).max())
             .reset_index())
Out[827]:
  col1 col2  null
0    A    A     3
1    A    B     2
2    B    B     0
3    B    D     1

有关如何找到连续组的信息,请参阅https://stackoverflow.com/a/27626699

答案 1 :(得分:-1)

我会建议这个算法

1)制作字典:{(col1,col2):numberOfConsecutiveNANs}

2)逐行读取并计算连续的NAN

3)与字典中的数字进行比较,如果更大 - > ovvewrite数字