Python 提取数据帧中第一个和最后一个值之间的最大连续缺失值

Python 提取数据帧中第一个和最后一个值之间的最大连续缺失值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据集,其中的列从不同的日期开始: | Date | Hour | A | B | C | D | -------------------------------------- | 01/01/2012 | 01:00 | | 1 | 2 | | | 01/01/2012 | 03:00 | | | | 1 | | 01/01/2012 | 07:00 | | 5 | | | | 15/04/2012 | 01:00 | 1 | | 2

我有一个数据集,其中的列从不同的日期开始:

| Date       | Hour  | A | B | C | D |
--------------------------------------
| 01/01/2012 | 01:00 |   | 1 | 2 |   |
| 01/01/2012 | 03:00 |   |   |   | 1 |
| 01/01/2012 | 07:00 |   | 5 |   |   |
| 15/04/2012 | 01:00 | 1 |   | 2 | 3 |
| 16/01/2013 | 05:00 | 1 | 1 |   |   |
我想提取关于连续缺失值数量的信息,不包括每列第一个和最后一个条目之外的记录。我目前正在使用:

df['Consecutive'] = df.Count.groupby((df.Count != df.Count.shift()).cumsum()).transform('size') * df.Count
当df看起来像:

| A | Count |
-------------
|   | True  |
|   | True  |
|   | True  |
| 1 | False |
| 1 | False |
此处最大连续值应为0(当前上述语句的最大连续值为3) 或

此处最大连续值应为1 等

获取连续缺失的行,但我不知道如何排除数据收集范围之外的区域

我相信我要么需要在开始和结束范围内进行计算,要么删除开始和结束空白记录,但我不确定如何进行此操作

非常感谢您的帮助,干杯。

我认为您需要:

print (df)
         Date   Hour    A    B    C    D
0  01/01/2012  01:00  NaN  1.0  2.0  NaN
1  01/01/2012  03:00  NaN  NaN  NaN  1.0
2  01/01/2012  07:00  NaN  5.0  NaN  NaN
3  15/04/2012  01:00  1.0  NaN  2.0  3.0
4  16/01/2013  05:00  1.0  1.0  NaN  NaN
5  01/01/2012  01:00  NaN  1.0  2.0  NaN
6  01/01/2012  03:00  NaN  NaN  NaN  1.0
7  01/01/2012  07:00  NaN  NaN  NaN  NaN
8  15/04/2012  01:00  1.0  NaN  2.0  3.0
9  16/01/2013  05:00  1.0  1.0  NaN  NaN

df = df.set_index(['Date','Hour'])
m = df.ffill().isnull() | df.bfill().isnull()
a = (df.isnull() & ~m)
b = a.cumsum()
c = (b-b.mask(a).ffill().fillna(0)).max()
print (c)
A    3.0
B    3.0
C    2.0
D    2.0
dtype: float64
详细信息

print (a)
                      A      B      C      D
Date       Hour                             
01/01/2012 01:00  False  False  False  False
           03:00  False   True   True  False
           07:00  False  False   True   True
15/04/2012 01:00  False   True  False  False
16/01/2013 05:00  False  False   True   True
01/01/2012 01:00   True  False  False   True
           03:00   True   True   True  False
           07:00   True   True   True   True
15/04/2012 01:00  False   True  False  False
16/01/2013 05:00  False  False  False  False
说明

print (a)
                      A      B      C      D
Date       Hour                             
01/01/2012 01:00  False  False  False  False
           03:00  False   True   True  False
           07:00  False  False   True   True
15/04/2012 01:00  False   True  False  False
16/01/2013 05:00  False  False   True   True
01/01/2012 01:00   True  False  False   True
           03:00   True   True   True  False
           07:00   True   True   True   True
15/04/2012 01:00  False   True  False  False
16/01/2013 05:00  False  False  False  False
  • 首先使用
    正向
    反向填充
    NaN
    s创建布尔掩码,以排除第一个和最后一个值
  • 然后计算每列的每个
    True
    s连续值,并获得
    max

  • @不客气,这是一个非常好的问题,我真的很喜欢解决它。只需进一步研究它的工作原理。需要fillna(0),因为它似乎不会在任何情况下改变答案way@MaskedMonkey-所以请随意省略:)