熊猫在没有NAN的情况下选择所有列



我有一个带有200列的DF。他们中的大多数都与Nan一起。我想选择没有NAN的所有列,或者至少在NAN的最低限度下选择。我试图以阈值或notnull()但没有成功来删除所有内容。任何想法。

df.dropna(thresh=2, inplace=True)
df_notnull = df[df.notnull()]

df例如:

col1  col2 col3
23     45  NaN
54     39  NaN
NaN    45  76
87     32  NaN

输出应该看起来像:

 df.dropna(axis=1, thresh=2)
    col1  col2
    23     45  
    54     39  
    NaN    45  
    87     32  

您可以使用

使用非nan列创建
df = df[df.columns[~df.isnull().all()]]

null_cols = df.columns[df.isnull().all()]
df.drop(null_cols, axis = 1, inplace = True)

如果您想根据一定百分比的NAN删除列,则说具有90%以上数据的列

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

df[df.columns[~df.isnull().any()]]将为您提供一个数据框

df[df.columns[~df.isnull().all()]]仅删除除空值外,什么都没有的列,并留下一个没有一个非零值的列。

df.isnull() 将返回具有与DF相同形状的布尔值的数据框架。如果特定值不为null,则这些布尔将是正确的。

df.isnull().any() 对于所有列带有一个null的所有列都将返回true。这是我与所接受的答案分歧的地方,因为 df.isnull().all() 都不会以一个值标记列!

我假设您不会在没有任何NAN的情况下获得所有列。如果是这样,您可以首先在不使用~col.isnull.any()的情况下获取列的名称,然后使用列。

我可以在以下代码中思考:

import pandas as pd
df = pd.DataFrame({
    'col1': [23, 54, pd.np.nan, 87],
    'col2': [45, 39, 45, 32],
    'col3': [pd.np.nan, pd.np.nan, 76, pd.np.nan,]
})
# This function will check if there is a null value in the column
def has_nan(col, threshold=0):
    return col.isnull().sum() > threshold
# Then you apply the "complement" of function to get the column with
# no NaN.
df.loc[:, ~df.apply(has_nan)]
# ... or pass the threshold as parameter, if needed
df.loc[:, ~df.apply(has_nan, args=(2,))]

这是一个简单的功能,您可以通过传递数据框架和阈值直接使用

df
'''
     pets   location     owner     id
0     cat  San_Diego     Champ  123.0
1     dog        NaN       Ron    NaN
2     cat        NaN     Brick    NaN
3  monkey        NaN     Champ    NaN
4  monkey        NaN  Veronica    NaN
5     dog        NaN      John    NaN
'''

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,1) #Here threshold is 1% which means we are going to drop columns having more than 1% of missing values
#output
'''
# Columns having more than 1 percent missing values: 2
Columns:
 ['id', 'location']
'''

现在创建新的数据帧,不包括这些列

l = rmissingvaluecol(df,1)
df1 = df[l]

PS:您可以根据要求更改阈值

奖金步骤

您可以找到每列缺少值的百分比(可选)

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        0.00
pets         0.00
dtype: float64
'''

您应该尝试df_notnull = df.dropna(how='all')这只会使您只能无效行。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.dataframe.dropna.html

null_series = df.isnull().sum() # The number of missing values from each column in your dataframe
full_col_series = null_series[null_series == 0] # Will keep only the columns with no missing values
df = df[full_col_series.index]

这对我来说非常有用,也许也适合您的需求!

def nan_weed(df,thresh):
ind = []
i = df.shape[1]
for j in range(0,i-1):
    if df[j].isnull().sum() <= thresh:
        ind.append(j)
return df[ind]

我看到了很多如何摆脱该线程上的无效值。对于我的数据框,从来都不是这种情况。我们不删除数据。永远。

我把这个问题当作如何使您的空值显示出来,就我而言,我必须找到纬度和经度并填写。

我所做的是对于一个列nulls

df[df['Latitude'].isnull()]

或解释

dataframe[dataframe['Column you want'].isnull()]

这使我的整个数据框架和所有纬度的所有缺失值。

这是不起作用的,我无法解释原因。尝试同时执行两列:

df[df[['Latitude','Longitude']].isnull()]

将为我提供整个数据框架中的所有NAN。

因此,立即完成这一切,我添加的是ID,在我的情况下,我的每行IS是APN,而我需要的两列

df[df['Latitude'].isnull()][['APN','Latitude','Longitude']]

通过执行这个小技巧,我也能够获得我所需的所有ID,也可以为600,000多行的数据添加数据以进行过滤。然后再做一次经度,只是为了确保我没有错过任何东西。

相关内容

  • 没有找到相关文章

最新更新