Как найти, какие столбцы содержат любое значение NaN в кадре данных Pandas


144

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

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


5
df.isna().any()[lambda x: x]работает на меня
matanster

Ответы:


249

ОБНОВЛЕНИЕ: использование панд 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

Спасибо за ответ! Я ищу, чтобы получить список имен столбцов (я обновил свой вопрос соответственно), вы знаете, как?
Денвар

Вы знаете хороший способ выбрать все столбцы с определенным значением вместо нулевых значений?
gregorio099

1
Неважно! Просто замените .isnull () на .isin (['xxx']), чтобы искать значения вместо нулей:df.columns[df.isin['xxx'].any()].tolist()
gregorio099

@ gregorio099, я бы сделал это так:df.columns[df.eq(search_for_value).any()].tolist()
MaxU

1
Хороший ответ, уже проголосовал. Идея - вы можете добавить новые функции isna, notna ?
Джезраэль

26

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


9

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

nan_cols = [i for i in df.columns if df[i].isnull().any()]

если это кому-нибудь пригодится


4

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

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)

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


2

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

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))

2

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

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

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

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


1

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

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

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

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

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

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

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

Спасибо за несколько подходов!
Майк Рападас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.