是否可以删除NaN值仅超过特定重复阈值的行?
例如,假设我们希望连续行的阈值为4。下面的示例连续六个具有NaN值的行将删除所有六个行。
start value
2018-03-11 09:00:00+00:00 0.8
2018-03-11 09:15:00+00:00 0.0
2018-03-11 09:30:00+00:00 NaN
2018-03-11 09:45:00+00:00 NaN
2018-03-11 10:00:00+00:00 NaN
2018-03-11 10:15:00+00:00 NaN
2018-03-11 10:30:00+00:00 NaN
2018-03-11 10:45:00+00:00 NaN
2018-03-11 11:00:00+00:00 1.0
2018-03-11 11:15:00+00:00 1.6
2018-03-11 11:30:00+00:00 0.8
但是下面的示例不会删除任何行。
start value
2018-03-11 09:00:00+00:00 0.8
2018-03-11 09:15:00+00:00 0.0
2018-03-11 09:30:00+00:00 0.0
2018-03-11 09:45:00+00:00 0.8
2018-03-11 10:00:00+00:00 NaN
2018-03-11 10:15:00+00:00 NaN
2018-03-11 10:30:00+00:00 NaN
2018-03-11 10:45:00+00:00 NaN
2018-03-11 11:00:00+00:00 1.0
2018-03-11 11:15:00+00:00 1.6
2018-03-11 11:30:00+00:00 0.8
谢谢!
答案 0 :(得分:3)
使用diff
和ne
cumsum
创建组密钥,然后进行布尔切片。
n=4
s=df.value.isnull().groupby(df.value.isnull().astype(int).diff().ne(0).cumsum()).transform('count')
df.loc[~((s>n)&(df.value.isnull()))]
Out[69]:
start value
0 2018-03-1109:00:00+00:00 0.8
1 2018-03-1109:15:00+00:00 0.0
8 2018-03-1111:00:00+00:00 1.0
9 2018-03-1111:15:00+00:00 1.6
10 2018-03-1111:30:00+00:00 0.8
答案 1 :(得分:1)
filter
传递可识别群组长度是否小于阈值的呼叫对象
mask = df.value.notna()
grps = pd.Series([*zip(mask.cumsum(), mask)], df.index)
df.groupby(grps).filter(lambda d: len(d) <= 4)
start value
0 2018-03-11 09:00:00+00:00 0.8
1 2018-03-11 09:15:00+00:00 0.0
8 2018-03-11 11:00:00+00:00 1.0
9 2018-03-11 11:15:00+00:00 1.6
10 2018-03-11 11:30:00+00:00 0.8