Як знайти, які стовпці містять значення NaN у фреймі даних Pandas


144

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

Питання: Як визначити, які стовпці містять значення NaN? Зокрема, чи можу я отримати список назв стовпців, що містять NaN?


5
df.isna().any()[lambda x: x]працює для мене
matanster

Відповіді:


249

ОНОВЛЕННЯ: за допомогою 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

Дякуємо за відповідь! Я шукаю, щоб отримати список назв стовпців (я відповідно оновив своє запитання), знаєте як?
денвар

Чи знаєте ви хороший спосіб вибору всіх стовпців із конкретним значенням замість нульових значень?
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 ?
jezrael

26

Можна використовувати df.isnull().sum(). Він показує всі стовпці та загальну кількість NaNs кожної функції.


8

У мене виникла проблема, коли мені довелося багато стовпців, щоб візуально перевірити на екрані, так що список із короткого списку, який фільтрує та повертає стовпці, що порушують

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.