我正在阅读一堆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)
现在问题是:它的月度数据,所以如果我有超过2个连续NaN,我也想丢弃数据,因为这意味着我“猜测”整个赛季,甚至更多.
documentation for fillna
并没有真正提到当连续NaN超过我指定的限制= 2时会发生什么,但当我在…之前和之后查看RainD.describe()时…并将其与基本CSV进行比较,很明显它填充了前2个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
如果您想要找到连续NaN出现在哪里的位置,您可以执行以下操作:
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