识别具有 pandas 的连续NAN

2022-04-14 00:00:00 python pandas nan

问题描述

我正在读入一堆CSV文件(一段时间内水位的测量数据),以便对它们进行各种分析和可视化。

由于各种我无法控制的原因,这些时间序列经常有缺失数据,所以我做了两件事:

我用

合计
Rlength = len(RainD)   # Counts everything, including NaN
Rcount = RainD.count() # Counts only valid numbers
NaN_Number = Rlength - Rcount

如果缺少的数据多于某个阈值,则丢弃数据集:

Percent_Data = Rlength/100
Five_Percent = Percent_Data*5
if NaN_Number > Five_Percent:
    ...

如果NaN的数量足够少,我想用

来填补空白
RainD.level = RainD.level.fillna(method='pad', limit=2)

现在是问题:这是月度数据,所以如果我有两个以上的连续NAN,我也想丢弃这些数据,因为这意味着我要猜测整个赛季,甚至更长时间。

documentation for fillna实际上并没有提到当连续的NaN比我指定的limit=2多时会发生什么,但是当我查看...fillna...之前和之后的RainD.describe()并将其与基本CSV进行比较时,很明显它填充了前两个NaN,然后保留其余的,而不是出错。

所以,长话短说:

如何使用Pandas标识多个连续的NAN,而不会出现一些复杂且耗时的非Pandas循环?


解决方案

可以使用多个布尔条件来测试当前值和上一个值是否为NaN

In [3]:

df = pd.DataFrame({'a':[1,3,np.NaN, np.NaN, 4, np.NaN, 6,7,8]})
df
Out[3]:
    a
0   1
1   3
2 NaN
3 NaN
4   4
5 NaN
6   6
7   7
8   8
In [6]:

df[(df.a.isnull()) & (df.a.shift().isnull())]
Out[6]:
    a
3 NaN

如果要查找连续NaNs出现的位置,您可以执行以下操作:

In [38]:

df = pd.DataFrame({'a':[1,2,np.NaN, np.NaN, np.NaN, 6,7,8,9,10,np.NaN,np.NaN,13,14]})
df
Out[38]:
     a
0    1
1    2
2  NaN
3  NaN
4  NaN
5    6
6    7
7    8
8    9
9   10
10 NaN
11 NaN
12  13
13  14

In [41]:

df.a.isnull().astype(int).groupby(df.a.notnull().astype(int).cumsum()).sum()
Out[41]:
a
1    0
2    3
3    0
4    0
5    0
6    0
7    2
8    0
9    0
Name: a, dtype: int32

相关文章