Удалить столбцы NaN/NULL в кадре данных Pandas? - программирование
Подтвердить что ты не робот

Удалить столбцы NaN/NULL в кадре данных Pandas?

У меня есть dataFrame в пандах, и некоторые из столбцов имеют все нулевые значения. Есть ли встроенная функция, которая позволит мне удалить эти столбцы?

4b9b3361

Ответ 1

Да, dropna. См. http://pandas.pydata.org/pandas-docs/stable/missing_data.html и DataFrame.dropna docstring:

Definition: DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None)
Docstring:
Return object with labels on given axis omitted where alternately any
or all of the data are missing

Parameters
----------
axis : {0, 1}
how : {'any', 'all'}
    any : if any NA values are present, drop that label
    all : if all values are NA, drop that label
thresh : int, default None
    int value : require that many non-NA values
subset : array-like
    Labels along other axis to consider, e.g. if you are dropping rows
    these would be a list of columns to include

Returns
-------
dropped : DataFrame

Конкретная команда для запуска:

df=df.dropna(axis=1,how='all')

Ответ 2

Функция для удаления всех пустых столбцов из фрейма данных:

def Remove_Null_Columns(df):
    dff = pd.DataFrame()
    for cl in fbinst:
        if df[cl].isnull().sum() == len(df[cl]):
            pass
        else:
            dff[cl] = df[cl]
    return dff 

Эта функция удалит все пустые столбцы из df.

Ответ 3

Вот простая функция, которую вы можете использовать напрямую, передавая фрейм данных и порог

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