我的数据集包含从不同日期开始的列:
| 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 |
此处Max Consecutive应为0(目前上述声明将获得Max Consecutive为3) 或
| D | Count |
-------------
| | True |
| 1 | False |
| | True |
| 3 | False |
| | True |
这里Max Consecutive应为1 等
要获取连续缺失的行,但我无法弄清楚如何排除数据收集范围之外的区域。
我相信我要么在开始和结束范围内计算,要么删除开始和结束的空白记录,但我不知道如何去做。
任何帮助都将非常感谢,干杯。
答案 0 :(得分:3)
我认为需要:
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
<强>解释强>:
forward
和back filling
NaN
创建布尔掩码,以排除第一个和最后一个值True
个连续值,并获得max