在熊猫中删除重复NaN值超过阈值的行

时间:2018-08-27 20:47:45

标签: python pandas

是否可以删除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

谢谢!

2 个答案:

答案 0 :(得分:3)

使用diffne 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