我正在读取一堆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,我也想丢弃该数据,因为那将意味着我“猜测”了整个季节,甚至更多。
的文档fillna没有真正提到当连续的NaN超过我指定的数量时会发生什么limit=2,但是当我查看RainD.describe()前后...fillna...将其与基本CSV进行比较时,很明显它会填充前两个NaN,然后保留保持原样,而不是出错。
fillna
limit=2
RainD.describe()
...fillna...
因此,长话短说:
如何在不存在一些复杂且耗时的非熊猫循环的情况下,识别出多个连续的带有熊猫的NaN?
您可以使用多个布尔条件来测试当前值和先前值是否为NaN:
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出现的位置,并且要查找两个以上的位置,可以执行以下操作:
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