如果列超过特定数量的NA值,则删除该列

DRP*_*RPR 6 python data-analysis dataframe python-3.x pandas

我想写一个程序,如果它超过特定数量的NA值,就会删除一列.这就是我所做的.

def check(x):
for column in df:
    if df.column.isnull().sum() > 2:
        df.drop(column,axis=1)
Run Code Online (Sandbox Code Playgroud)

在执行上述代码时没有错误,但在执行操作时 df.apply(check),会出现大量错误.

PS:我知道关于thresh的争论 df.dropna(thresh,axis)

有什么提示吗?为什么我的代码不起作用?

谢谢

jez*_*ael 2

我认为这里最好是dropna与参数一起使用thresh

阈值:整数,可选

需要那么多非 NA 值。

因此,对于向量化解决方案,从 的长度中减去它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
Run Code Online (Sandbox Code Playgroud)

我建议使用DataFrame.pipeapply 函数来DataFrame更改df.column输入df[column],因为变量中的动态列名称的点表示法失败(它尝试选择列名称column):

df = pd.DataFrame({'A':list('abcdef'),
                   'B':[np.nan,np.nan,np.nan,5,5,np.nan],
                   'C':[np.nan,8,np.nan,np.nan,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,np.nan],
                   '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
        
        
Run Code Online (Sandbox Code Playgroud)

  • 因为`.apply`对每一列或每一行分别循环,所以这里需要输入所有`DataFrame` (2认同)