我想写一个程序,如果它超过特定数量的NA值,就会删除一列.这就是我所做的.
def check(x): for column in df: if df.column.isnull().sum() > 2: df.drop(column,axis=1)
执行上面的代码没有错误,但在执行df.apply(check)时,会出现大量错误.
P.S:我知道df.dropna中的thresh争论(thresh,axis)
谢谢
解决方法
我认为最好的是使用
dropna
参数thresh:
thresh : int,optional
Require that many non-NA values.
因此,对于vectorize解决方案,从DataFrame的长度中减去它:
N = 2 df = df.dropna(thresh=len(df)-N,axis=1) print (df) A D E F 0 a 1 5.0 a 1 b 3 3.0 a 2 c 5 6.0 a 3 d 7 9.0 b 4 e 1 2.0 b 5 f 0 NaN b
我建议使用DataFrame.pipe
作为输入DataFrame的apply函数,将df.column更改为df [column],因为带有来自变量的动态列名的点表示法失败(它尝试选择列名列):
df = pd.DataFrame({'A':list('abcdef'),'B':[np.nan,np.nan,5,np.nan],'C':[np.nan,8,2,3],'D':[1,3,7,1,0],'E':[5,6,9,'F':list('aaabbb')}) print (df) A B C D E F 0 a NaN NaN 1 5.0 a 1 b NaN 8.0 3 3.0 a 2 c NaN NaN 5 6.0 a 3 d 5.0 NaN 7 9.0 b 4 e 5.0 2.0 1 2.0 b 5 f NaN 3.0 0 NaN b def check(df): for column in df: if df[column].isnull().sum() > 2: df.drop(column,axis=1,inplace=True) return df print (df.pipe(check)) A D E F 0 a 1 5.0 a 1 b 3 3.0 a 2 c 5 6.0 a 3 d 7 9.0 b 4 e 1 2.0 b 5 f 0 NaN b