如何删除数据框中具有较低完整性率的某些功能(Python)

时间:2018-11-07 13:41:38

标签: python pandas dataframe

我有一个数据框,其中包含450多个变量和500,000多行。但是,有些变量的空值超过90%。我想删除空行超过90%的功能。

我对变量做了描述:

数据帧:

df = pd.DataFrame({
    'A':list('abcdefghij'),
     'B':[4,np.nan,np.nan,np.nan,np.nan,np.nan, np.nan, np.nan, np.nan, np.nan],
     'C':[7,8,np.nan,4,2,3,6,5, 4, 6],
     'D':[1,3,5,np.nan,1,0,10,7, np.nan, 5],
     'E':[5,3,6,9,2,4,7,3, 5, 9],
     'F':list('aaabbbckfr'),
     'G':[np.nan,8,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan, np.nan, np.nan]})

print(df)
   A    B  C   D  E  F    G
0  a  4.0  7   1  5  a  NaN
1  b  NaN  8   3  3  a  8.0
2  c  NaN  NaN 5  6  a  NaN
3  d  NaN  4  NaN 9  b  NaN
4  e  NaN  2   1  2  b  NaN
5  f  NaN  3   0  4  b  NaN
6  g  NaN  6  10  7  c  NaN
7  h  NaN  5   7  3  k  NaN
8  i  NaN  4  NaN 5  f  NaN
9  j  NaN  6   5  9  r  NaN

描述:

desc = df.describe(include = 'all')
d1 = desc.loc['varType'] = desc.dtypes
d3 = desc.loc['rowsNull'] = df.isnull().sum()
d4 = desc.loc['%rowsNull'] = round((d3/len(df))*100, 2)

print(desc)
                A        B        C        D        E       F        G
count          10        1       10       10       10      10        1
unique         10      NaN      NaN      NaN      NaN       6      NaN
top             i      NaN      NaN      NaN      NaN       b      NaN
freq            1      NaN      NaN      NaN      NaN       3      NaN
mean          NaN        4      5.4      4.3      5.3     NaN        8
std           NaN      NaN  2.22111  3.16403  2.45176     NaN      NaN
min           NaN        4        2        0        2     NaN        8
25%           NaN        4        4      1.5     3.25     NaN        8
50%           NaN        4      5.5      4.5        5     NaN        8
75%           NaN        4     6.75      6.5     6.75     NaN        8
max           NaN        4        9       10        9     NaN        8
varType    object  float64  float64  float64  float64  object  float64
rowsNull        0        9        1        2        0       0        9
%rowsNull       0       90       10       20        0       0       90

在此示例中,我们具有2个功能来删除“ B”和“ G”。 但是在我的情况下,我发现40个变量的'%rowsNull'大于> 90%,在建模时我应该如何不考虑这些变量?

我不知道该怎么做。

请帮助我。

谢谢。

3 个答案:

答案 0 :(得分:3)

首先比较丢失的值,然后得到Product(之所以起作用是因为const q = buildQuery("SELECT org.xfb.ipchain.Product WHERE ( (productState != 'REVOKE') AND (productState != 'SOLD') )"); const results = await query(q); console.log("results are " + results); // returns all status results.forEach(function(res){ console.log("result instance is " + res.id + " " + res.status); }); 的处理方式与mean相似),最后使用boolean indexingTrue进行了过滤,因为要删除列:

1

详细信息

loc

答案 1 :(得分:1)

您可以找到空值超过90%的列并删除

cols_to_drop = df.columns[df.isnull().sum()/len(df) >= .90]
df.drop(cols_to_drop, axis = 1, inplace = True)


    A   C   D   E   F
0   a   7.0 1.0 5   a
1   b   8.0 3.0 3   a
2   c   NaN 5.0 6   a
3   d   4.0 NaN 9   b
4   e   2.0 1.0 2   b
5   f   3.0 0.0 4   b
6   g   6.0 10.0    7   
7   h   5.0 7.0 3   k
8   i   4.0 NaN 5   f
9   j   6.0 5.0 9   r

答案 2 :(得分:1)

根据您的代码,您可以执行类似的操作

keepCols = desc.columns[desc.loc['%rowsNull'] < 90]
df = df[keepCols]