我有一个带有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多行的数据添加数据以进行过滤。然后再做一次经度,只是为了确保我没有错过任何东西。