Skip to content

Python Pandas: How to Check if a Cell Is Empty in a Pandas DataFrame

Learn how to detect empty cells in pandas DataFrames, including handling NaN, None, empty strings (""), and missing datetime values (NaT) using isnull(), isna(), and other methods.

When working with real-world data in pandas, encountering empty or missing cells is inevitable. Whether you're cleaning survey responses, processing financial records, or preparing data for machine learning, you need to reliably detect and handle these gaps before analysis.

Empty cells in a pandas DataFrame can take several forms:

  • NaN (Not a Number) - the standard representation of missing data in pandas
  • None - a Python object indicating absence of a value
  • Empty strings ("") - text fields left blank
  • NaT - missing datetime values

In this guide, you'll learn multiple methods to check for empty cells in a pandas DataFrame, from detecting individual missing values to finding entirely empty rows and columns.

Using isnull() to Detect Missing Values

The isnull() method is the most common way to check for missing values in a DataFrame. It returns a DataFrame of the same shape with True for each cell that contains NaN or None, and False for cells with actual data.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Alice', 'Bob', None],
    'Age': [25, None, 30],
    'Score': [88.5, 92.0, None]
})

print("Original DataFrame:")
print(df)
print("\nEmpty cell check (isnull):")
print(df.isnull())

Output:

Original DataFrame:
    Name   Age  Score
0  Alice  25.0   88.5
1    Bob   NaN   92.0
2   None  30.0    NaN

Empty cell check (isnull):
    Name    Age  Score
0  False  False  False
1  False   True  False
2   True  False   True

Every None and NaN value is flagged as True, making it easy to see exactly where data is missing.

Using isna() - An Alias for isnull()

The isna() method produces identical results to isnull(). It's simply an alias with a shorter, more intuitive name.

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, None],
    'col2': [3, None, 5]
})

print(df.isna())

Output:

    col1   col2
0  False  False
1  False   True
2   True  False

Checking if a Specific Cell Is Empty

To check whether a single cell at a specific row and column is empty, use pd.isnull() with .loc[] or .iloc[]:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Alice', 'Bob', None],
    'Age': [25, None, 30]
})

print(pd.isnull(df.loc[1, 'Age']))    # Row index 1, column 'Age'
print(pd.isnull(df.loc[0, 'Name']))   # Row index 0, column 'Name'

print(pd.isnull(df.iloc[2, 0]))       # Row 2, column 0

Output:

True
False
True

Counting Empty Cells

Knowing where cells are empty is useful, but often you also need to know how many are missing. Chain isnull() with sum():

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, np.nan, 3, np.nan],
    'B': [np.nan, 2, np.nan, 4],
    'C': [np.nan, np.nan, np.nan, np.nan]
})

print("Missing per column:")
print(df.isnull().sum())

print(f"\nTotal missing cells: {df.isnull().sum().sum()}")

print("\nMissing percentage per column:")
print((df.isnull().sum() / len(df) * 100).round(1))

Output:

Missing per column:
A    2
B    2
C    4
dtype: int64

Total missing cells: 8

Missing percentage per column:
A     50.0
B     50.0
C    100.0
dtype: float64

Finding Entirely Empty Rows and Columns

Sometimes you need to identify rows or columns where every cell is empty. Combine isnull() with all():

Finding Empty Rows

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, np.nan, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, np.nan, 12]
})

print("DataFrame:")
print(df)

empty_rows = df.isnull().all(axis=1)
print("\nEntirely empty rows:")
print(empty_rows)

Output:

DataFrame:
     A    B     C
0  1.0  5.0   9.0
1  NaN  NaN  10.0
2  NaN  NaN   NaN
3  4.0  8.0  12.0

Entirely empty rows:
0    False
1    False
2     True
3    False
dtype: bool

Row 2 is the only row where all cells are empty.

Finding Empty Columns

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, np.nan, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, np.nan, 12]
})

empty_cols = df.isnull().all(axis=0)
print("Entirely empty columns:")
print(empty_cols)

Output:

Entirely empty columns:
A    False
B    False
C    False
dtype: bool

No columns are entirely empty in this example.

Detecting Empty Strings

A common pitfall is that isnull() does not detect empty strings (""). Empty strings are valid Python objects, so pandas treats them as non-null values.

import pandas as pd

df = pd.DataFrame({
    'Name': ['Alice', '', None],
    'City': ['London', 'Paris', '']
})

print("isnull() check:")
print(df.isnull())

Output:

isnull() check:
    Name   City
0  False  False
1  False  False
2   True  False

To catch both NaN/None and empty strings, combine checks:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Alice', '', None],
    'City': ['London', 'Paris', '']
})

truly_empty = df.isnull() | df.eq('')

print("Comprehensive empty check:")
print(truly_empty)

Output:

Comprehensive empty check:
    Name   City
0  False  False
1   True  False
2   True   True

Now all forms of "empty" are detected.

Filtering Rows with Any Missing Values

To extract rows that contain at least one missing value, use any():

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Product': ['Widget', 'Gadget', 'Gizmo', 'Doohickey'],
    'Price': [9.99, None, 14.99, 7.50],
    'Stock': [100, 50, None, 200]
})

rows_with_missing = df[df.isnull().any(axis=1)]

print("Rows with missing data:")
print(rows_with_missing)

Output:

Rows with missing data:
  Product  Price  Stock
1  Gadget    NaN   50.0
2   Gizmo  14.99    NaN

Using notna() to Find Non-Empty Cells

The inverse of isna() is notna(), which returns True for cells that contain actual data:

import pandas as pd

df = pd.DataFrame({
    'A': [1, None, 3],
    'B': [None, 5, 6]
})

print(df.notna())

Output:

       A      B
0   True  False
1  False   True
2   True   True

This is especially useful for filtering rows where a specific column has data:

import pandas as pd

df = pd.DataFrame({
    'A': [1, None, 3],
    'B': [None, 5, 6]
})

filtered = df[df['A'].notna()]
print(filtered)

Output:

     A    B
0  1.0  NaN
2  3.0  6.0

Quick Reference

Method Detects NaN/None Detects "" Returns
df.isnull() / df.isna() ✅ ❌ DataFrame of booleans
df.notna() / df.notnull() ✅ (inverse) ❌ DataFrame of booleans
df.isnull().sum() ✅ ❌ Count per column
df.isnull().all(axis=1) ✅ ❌ Fully empty rows
df.isnull().any(axis=1) ✅ ❌ Rows with any missing value
df.isnull() | df.eq('') ✅ ✅ Both NaN and empty strings

Conclusion

Checking for empty cells in a pandas DataFrame is a critical first step in any data cleaning workflow. Here's when to use each method:

  • Use isnull() or isna() for a quick boolean map of all missing values across the entire DataFrame.
  • Use isnull().sum() to count missing values per column and assess data quality at a glance.
  • Use isnull().all() with the appropriate axis to find entirely empty rows or columns.
  • Combine isnull() with eq('') when your data may contain empty strings that should also be treated as missing.
  • Use notna() to filter and keep only rows or columns with valid data.

By mastering these methods, you can confidently identify and handle missing data before it impacts your analysis or models.

Navigation