如何删除Python中缺少太多值的列

如何删除Python中缺少太多值的列,python,pandas,dataframe,scikit-learn,missing-data,Python,Pandas,Dataframe,Scikit Learn,Missing Data,我正在研究一个机器学习问题,在这个问题中,特性中有许多缺少的值。有100个功能,我想删除那些有太多缺失值的功能(可能是缺失值超过80%的功能)。在Python中如何实现这一点 我的数据是一个熊猫数据框。演示: 设置: In[105]:df=pd.DataFrame(np.random.choice([2,np.nan],(20,5),p=[0.2,0.8]),columns=list('abcde')) In[106]:df 出[106]: a、b、c、d、e 0楠2.0楠楠楠 1楠楠2.0楠楠

我正在研究一个机器学习问题,在这个问题中,特性中有许多缺少的值。有100个功能,我想删除那些有太多缺失值的功能(可能是缺失值超过80%的功能)。在Python中如何实现这一点

我的数据是一个熊猫数据框。

演示:

设置:

In[105]:df=pd.DataFrame(np.random.choice([2,np.nan],(20,5),p=[0.2,0.8]),columns=list('abcde'))
In[106]:df
出[106]:
a、b、c、d、e
0楠2.0楠楠楠
1楠楠2.0楠楠2.0
2楠2.0楠楠楠楠
3南2.0
4 NaN 2.0 2.0南南
5楠楠楠楠
6楠2.0楠楠楠楠
7 2.0 2.0楠楠楠楠楠楠楠楠
8 2.0 2.0楠楠楠楠楠楠楠楠
9楠楠楠楠
10 NaN 2.0 2.0 NaN 2.0
11楠楠2.0楠楠
12 2.0楠楠2.0楠楠
13楠楠2.0楠楠
14楠楠2.02.0
15楠楠楠楠
16楠2.0楠楠楠楠
17 2.0楠楠2.0
18楠楠2.0楠
19 NaN 2.0 NaN 2.0 NaN
[107]中的df.isnull().mean()
出[107]:
a 0.80
b 0.55
c 0.85
d 0.70
e 0.75
数据类型:64
解决方案:

[108]中的
:df.columns[df.isnull().mean()<0.8]
Out[108]:索引(['b','d','e',dtype='object')
在[109]中:df[df.columns[df.isnull().mean()<0.8]]
出[109]:
b、d、e
02.0楠楠
1楠楠2.0
2.0楠楠楠
3楠楠2.0
4.2.0楠楠楠
5楠楠楠楠楠
6.2.0楠楠楠
7 2.0楠楠
82.0楠楠
9楠楠楠楠楠
10 2.0 NaN 2.0
11 NaN 2.0 NaN
12 NaN 2.0 NaN
13 NaN 2.0 NaN
14 NaN 2.0 2.0
15楠楠楠楠楠
16 2.0楠楠
17楠楠2.0
18 NaN 2.0 NaN
19 2.0 2.0 NaN

要在Pandas中进行概括,可以执行以下操作来计算缺少值的列中值的百分比。从这些列中,您可以筛选出空值超过80%的特性,然后从数据帧中删除这些列

pct_null = df.isnull().sum() / len(df)
missing_features = pct_null[pct_null > 0.80].index
df.drop(missing_features, axis=1, inplace=True)
以下是筛选行的选项:

df=pd.DataFrame(np.random.choice([2,np.nan],(5,10),p=[0.2,0.8]),columns=list('abcdefghij'))
a b c d e f g h i j
0楠楠2.0楠楠2.0
1 NaN 2.0 NaN 2.0 NaN 2.0 NaN 2.0
2楠楠2.0楠楠2.0楠楠2.0楠楠楠楠2.0楠楠楠
3楠楠2.0楠楠2.0
4 2.0 2.0 2.0楠楠楠楠楠楠
df.loc[df.isnull().mean(轴=1).lt(0.8)]
a b c d e f g h i j
1 NaN 2.0 NaN 2.0 NaN 2.0 NaN 2.0
2楠楠2.0楠楠2.0楠楠2.0楠楠楠楠2.0楠楠楠
4 2.0 2.0 2.0楠楠楠楠楠楠
您可以使用熊猫

下面是一个简单的函数,您可以通过传递数据帧和阈值直接使用它 现在创建一个新的数据框,不包括以下列:

l = rmissingvaluecol(df, 49)
df1 = df[l]
奖励步骤 您可以找到每列缺失值的百分比(可选)


查找NaN之和或按列百分比的最快方法是:

  • 对于sum:df.isna().sum()
  • 对于百分比:df.isna().mean()
使用:


df=df[df.isnull().sum(axis=1)关于dropna()的一件事根据文档,thresh参数指定要保留的非NaN的数量。

一如既往的好解决方案,+1。但是,为了可见性,我想说的是最好有更多的列,而不是行。我也添加了一个行过滤器作为答案。(也许只有我——坐在笔记本电脑上)欢迎使用StAcdPosits。这似乎更像是一个评论而不是答案。请考虑评论你最喜欢的答案。我确实尝试过,但是我似乎还没有足够的“名声”。但是,我想我提到的点可以改变DROPNA()的输出。.坚持住。不久你就可以发表评论了。谢谢你的鼓励!
def rmissingvaluecol(dff, threshold):
    l = []
    l = list(dff.drop(dff.loc[:,list((100*(dff.isnull().sum()/len(dff.index)) >= threshold))].columns, 1).columns.values)
    print("# Columns having more than %s percent missing values: "%threshold, (dff.shape[1] - len(l)))
    print("Columns:\n", list(set(list((dff.columns.values))) - set(l)))
    return l


rmissingvaluecol(df,80) # Here threshold is 80% which means we are going to drop columns having more than 80% of missing values

# Output
'''
# Columns having more than 60 percent missing values: 2
Columns:
 ['id', 'location']
'''
l = rmissingvaluecol(df, 49)
df1 = df[l]
def missing(dff):
    print (round((dff.isnull().sum() * 100/ len(dff)),2).sort_values(ascending=False))

missing(df)

# Output
'''
id          83.33
location    83.33
owner       16.67
pets        16.67
dtype: float64
'''
def show_null_columns(data, agg, threshold):
    if agg == 'sum':
       null_cols = data.isnull().sum()
    elif agg == 'mean':
       null_cols = data.isnull().mean()
    columns = data.columns
    null_dic = {}
    for col,x in zip(columns, null_cols):
        if x>= threshold:
            null_dic[col] = x
    return null_dic

null_dic = show_null_columns(train, 'mean', 0.8)
train2 = train.drop(null_dic.keys(), axis=1)