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

时间:2018-07-14 06:11:23

标签: python python-3.x pandas dataframe data-analysis

我想编写一个程序,如果超过了特定数量的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,axis)

中关于脱粒的争论

任何提示?为什么我的代码不起作用?

谢谢

3 个答案:

答案 0 :(得分:4)

尽管jezrael的答案行之有效,但这不是您应该采取的方法。而是创建一个掩码:~df.isnull().sum().gt(2)并与.loc[:,m]一起应用以访问列。

完整示例:

import pandas as pd
import numpy as np

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')
})

m = ~df.isnull().sum().gt(2)
df = df.loc[:,m]

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

说明

假定在应用之前先打印列和蒙版。

print(df.columns.tolist())
print(m.tolist())

它将返回以下内容:

['A', 'B', 'C', 'D', 'E', 'F']
[True, False, False, True, True, True]

B和C列是不需要的(False)。涂上口罩后,它们会被去除。

答案 1 :(得分:2)

我认为最好是在参数thresh中使用dropna

  

thresh:int,可选

     

需要许多非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

我建议将DataFrame更改为df.column,将DataFrame.pipe用于输入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

答案 2 :(得分:2)

或者,您可以使用<?php $fetchname = "SELECT `Names` FROM `users`"; $fetched = mysqli_query($con,$fetchname); while($row = mysqli_fetch_array($fetched,MYSQLI_ASSOC)){ ?> <select name="Names"> <option value=""><?php echo $row['names']; ?></option> </select> <?php } ?> 来计数非空值

count