Учитывая фрейм данных pandas, содержащий возможные значения NaN, разбросанные здесь и там:

Вопрос: Как определить, какие столбцы содержат значения NaN? В частности, могу ли я получить список имен столбцов, содержащих NaN?

jesperk.eth

Ответов: 13

Ответы (13)

ОБНОВЛЕНИЕ: с использованием Pandas 0.22.0

Новые версии Pandas имеют новые методы 'DataFrame.isna ()' и 'DataFrame.notna ()'

In [71]: df
Out[71]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [72]: df.isna().any()
Out[72]:
a     True
b     True
c    False
dtype: bool

в виде списка столбцов:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

для выбора этих столбцов (содержащих хотя бы одно значение NaN):

In [73]: df.loc[:, df.isna().any()]
Out[73]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

СТАРЫЙ ответ:

Попробуйте использовать isnull ():

In [97]: df
Out[97]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [98]: pd.isnull(df).sum() > 0
Out[98]:
a     True
b     True
c    False
dtype: bool

или как @root предлагает более понятную версию:

In [5]: df.isnull().any()
Out[5]:
a     True
b     True
c    False
dtype: bool

In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']

для выбора подмножества - все столбцы, содержащие хотя бы одно NaN значение:

In [31]: df.loc[:, df.isnull().any()]
Out[31]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

Это один из способов ..

import pandas as pd
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan],'c':[np.nan,2,np.nan], 'd':[np.nan,np.nan,np.nan]})
print(pd.isnull(df).sum())

введите описание изображения здесь

df.isna () return True значения для NaN, False для остальных. Итак, делаем:

df.isna (). Любой ()

вернет True для любого столбца, имеющего NaN, False для остальных

Это сработало для меня,

1. Для получения столбцов, имеющих хотя бы одно нулевое значение. (названия столбцов)

data.columns[data.isnull().any()]

2. Для получения столбцов со счетчиком, имеющим хотя бы одно нулевое значение.

data[data.columns[data.isnull().any()]].isnull().sum()

[Необязательно] 3. Для получения процента от нулевого счета.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
df.columns[df.isnull().any()].tolist()

он вернет имя столбца, содержащего пустые строки

Чтобы увидеть только столбцы, содержащие NaN, и только строки, содержащие NaN:

isnulldf = df.isnull()
columns_containing_nulls = isnulldf.columns[isnulldf.any()]
rows_containing_nulls = df[isnulldf[columns_containing_nulls].any(axis='columns')].index
only_nulls_df = df[columns_containing_nulls].loc[rows_containing_nulls]
print(only_nulls_df)

Я использую эти три строки кода, чтобы распечатать имена столбцов, которые содержат хотя бы одно нулевое значение:

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))
• 100001
nan_cols = [i for i in df.columns if df[i].isnull().any()]

, если это кому-то поможет

Добавьте к этому, если вы хотите отфильтровать столбцы, содержащие больше значений nan, чем пороговое значение, скажем, 85%, тогда используйте

nan_cols85 = [i для i в df.columns, если df [i] .isnull (). Sum ()> 0.85 * len (data)]

features_with_na = [функции для функций в dataframe.columns, если dataframe [features] .isnull (). Sum ()> 0]

для функции в features_with_na: print (feature, np.round (dataframe [feature] .isnull (). mean (), 4), '% пропущенных значений') print (features_with_na)

даст% пропущенного значения для каждого столбца в фрейме данных

Оба они должны работать:

df.isnull().sum()
df.isna().sum()

Методы DataFrame isna () или isnull () полностью идентичны.

Примечание: пустые строки '' считается ложным (не считается NA)

В наборах данных, имеющих большое количество столбцов, еще лучше видеть, сколько столбцов содержат нулевые значения, а сколько нет.

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

Например, в моем фрейме данных он содержал 82 столбца, из которых 19 содержали по крайней мере одно нулевое значение.

Кроме того, вы также можете автоматически удалять столбцы и строки в зависимости от того, у кого больше нулевых значений
Вот код, который делает это разумно:

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

Примечание: Приведенный выше код удаляет все ваши нулевые значения. Если вам нужны нулевые значения, обработайте их раньше.

Вы можете использовать df.isnull (). Sum (). Он показывает все столбцы и общее количество NaN для каждой функции.

Я знаю, что это очень хорошо ответ на вопрос, но я хотел добавить небольшую поправку. Этот ответ возвращает только столбцы, содержащие нули, а также показывает количество нулей.

Как однострочный:

pd.isnull(df).sum()[pd.isnull(df).sum() > 0]

Описание

  1. Подсчитывать нули в каждом столбце
null_count_ser = pd.isnull(df).sum()
  1. True | Ложный ряд, описывающий, имел ли этот столбец нули
is_null_ser = null_count_ser > 0
  1. Используйте серию T | F, чтобы отфильтровать тех, у кого нет
null_count_ser[is_null_ser]

Пример вывода

name          5
phone         187
age           644

2022 WebDevInsider