提取数据框

时间:2018-04-03 10:23:42

标签: 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 | 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 等

要获取连续缺失的行,但我无法弄清楚如何排除数据收集范围之外的区域。

我相信我要么在开始和结束范围内计算,要么删除开始和结束的空白记录,但我不知道如何去做。

任何帮助都将非常感谢,干杯。

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

<强>解释

  1. 首先使用forwardback filling NaN创建布尔掩码,以排除第一个和最后一个值
  2. 然后计算每列True个连续值,并获得max