Python 如果连续NAN超过3个,则删除列

Python 如果连续NAN超过3个,则删除列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在尝试删除具有超过3个或k个连续NaN的列。对熊猫来说是新的。感谢您的帮助 数据看起来像 200 2000 7632 123 NaN 1232 98 NaN 12324 4231 NaN 673 87 76 1000 您可以使用以下简单示例: import pandas as pd import numpy as np df = pd.DataFrame({'col1':[1,2,3,4], 'col2':[None,None,None,5], 'col3':[6,

我正在尝试删除具有超过3个或k个连续NaN的列。对熊猫来说是新的。感谢您的帮助

数据看起来像

200  2000 7632
123  NaN  1232
98   NaN  12324
4231 NaN  673
87   76   1000

您可以使用以下简单示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'col1':[1,2,3,4], 'col2':[None,None,None,5], 'col3':[6, None, None, 5] })
df

    col1    col2    col3
0   1       NaN     6.0
1   2       NaN     NaN
2   3       NaN     NaN
3   4       5.0     5.0
    col1    col3
0   1       6.0
1   2       NaN
2   3       NaN
3   4       5.0
编辑

删除连续的NAN:

df

    col1    col2    col3
0   1       NaN     6.0
1   2       NaN     NaN
2   3       NaN     NaN
3   4       5.0     5.0
    col1    col3
0   1       6.0
1   2       NaN
2   3       NaN
3   4       5.0

可能不是最有效的解决方案,但易于实现:对于每个列,尝试使用3个
NaN
s的第一个元组,如果找到,将此列添加到要删除的列列表中

import pandas as pd
import more_itertools as mit

df = pd.DataFrame({'col1': [1,2,3,4], 'col2': [None,None,5,None], 'col3': [6,None,None,None]})

to_drop = []
for c in df:
  try:
    next(mit.locate(df[c].isna(), lambda *x: all(x) == True, 3))
    to_drop.append(c)
  except:
    pass
df = df.drop(to_drop, 1)
print(df)
结果:

   col1  col2
0     1   NaN
1     2   NaN
2     3   5.0
3     4   NaN

您可以这样做:

df=pd.DataFrame()
df['col1']=[np.nan,1,2,np.nan,3,np.nan,np.nan]
df['col2']=[np.nan,np.nan,np.nan,np.nan,1,2,3]
df['col3']=[1,2,3,4,np.nan,np.nan,np.nan]
print(df)


注:
如果它有3个或更多,则要从4中消除,必须将3替换为4

这不会找到连续的NAN。一列中的任何3个或更多“N”都将导致其删除。@Fogler我更正了我的答案。
df_filtered=df.loc[:,(df.notna().cumsum().shift().apply(lambda x: x.value_counts()).fillna(0)<3).all()]
print(df_filtered)
  col1
0   NaN
1   1.0
2   2.0
3   NaN
4   3.0
5   NaN
6   NaN