¿Cómo compruebo si un DataFrame de pandas está vacío?

Resuelto Nilani Algiriyage asked hace 11 años • 6 respuestas

¿ Cómo compruebo si un pandas DataFrameestá vacío? Me gustaría imprimir algún mensaje en la terminal si DataFrameestá vacío.

Nilani Algiriyage avatar Nov 07 '13 12:11 Nilani Algiriyage
Aceptado

Puedes usar el atributo df.emptypara comprobar si está vacío o no:

if df.empty:
    print('DataFrame is empty!')

Fuente: Documentación de Pandas

aIKid avatar Nov 07 '2013 05:11 aIKid

Yo uso la lenfunción. Es mucho más rápido que empty. len(df.index)es incluso más rápido.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10000, 4), columns=list('ABCD'))

def empty(df):
    return df.empty

def lenz(df):
    return len(df) == 0

def lenzi(df):
    return len(df.index) == 0

'''
%timeit empty(df)
%timeit lenz(df)
%timeit lenzi(df)

10000 loops, best of 3: 13.9 µs per loop
100000 loops, best of 3: 2.34 µs per loop
1000000 loops, best of 3: 695 ns per loop

len on index seems to be faster
'''
Zero avatar Jul 24 '2014 12:07 Zero

Para ver si un marco de datos está vacío, sostengo que se debe probar la longitud del índice de columnas de un marco de datos :

if len(df.columns) == 0: 1

Razón:

Según la API de referencia de Pandas , existe una distinción entre:

  • un marco de datos vacío con 0 filas y 0 columnas
  • un marco de datos vacío con filas que contienen, por NaNlo tanto , al menos 1 columna

Podría decirse que no son lo mismo. Las otras respuestas son imprecisas en el sentido de que df.empty, len(df)o len(df.index)no hacen distinción y el índice de retorno es 0 y vacío es Verdadero en ambos casos.

Ejemplos

Ejemplo 1: un marco de datos vacío con 0 filas y 0 columnas

In [1]: import pandas as pd
        df1 = pd.DataFrame()
        df1
Out[1]: Empty DataFrame
        Columns: []
        Index: []

In [2]: len(df1.index)  # or len(df1)
Out[2]: 0

In [3]: df1.empty
Out[3]: True

Ejemplo 2: un marco de datos que se vacía a 0 filas pero aún conserva ncolumnas

In [4]: df2 = pd.DataFrame({'AA' : [1, 2, 3], 'BB' : [11, 22, 33]})
        df2
Out[4]:    AA  BB
        0   1  11
        1   2  22
        2   3  33

In [5]: df2 = df2[df2['AA'] == 5]
        df2
Out[5]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

In [6]: len(df2.index)  # or len(df2)
Out[6]: 0

In [7]: df2.empty
Out[7]: True

Ahora, basándose en los ejemplos anteriores, en los que el índice es 0 y el vacío es True . Al leer la longitud del índice de columnas para el primer marco de datos cargado df1, devuelve 0 columnas para demostrar que efectivamente está vacío.

In [8]: len(df1.columns)
Out[8]: 0

In [9]: len(df2.columns)
Out[9]: 2

Fundamentalmente , si bien el segundo marco de datos df2 no ​​contiene datos, no está completamente vacío porque devuelve la cantidad de columnas vacías que persisten.

Por qué es importante

Agreguemos una nueva columna a estos marcos de datos para comprender las implicaciones:

# As expected, the empty column displays 1 series
In [10]: df1['CC'] = [111, 222, 333]
         df1
Out[10]:    CC
         0 111
         1 222
         2 333
In [11]: len(df1.columns)
Out[11]: 1

# Note the persisting series with rows containing `NaN` values in df2
In [12]: df2['CC'] = [111, 222, 333]
         df2
Out[12]:    AA  BB   CC
         0 NaN NaN  111
         1 NaN NaN  222
         2 NaN NaN  333
In [13]: len(df2.columns)
Out[13]: 3

Es evidente que las columnas originales en df2 han resurgido. Por lo tanto, es prudente leer la longitud del índice de las columnas para len(pandas.core.frame.DataFrame.columns)ver si un marco de datos está vacío.

Solución práctica

# New dataframe df
In [1]: df = pd.DataFrame({'AA' : [1, 2, 3], 'BB' : [11, 22, 33]})
        df
Out[1]:    AA  BB
        0   1  11
        1   2  22
        2   3  33

# This data manipulation approach results in an empty df
# because of a subset of values that are not available (`NaN`)
In [2]: df = df[df['AA'] == 5]
        df
Out[2]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

# NOTE: the df is empty, BUT the columns are persistent
In [3]: len(df.columns)
Out[3]: 2

# And accordingly, the other answers on this page
In [4]: len(df.index)  # or len(df)
Out[4]: 0

In [5]: df.empty
Out[5]: True
# SOLUTION: conditionally check for empty columns
In [6]: if len(df.columns) != 0:  # <--- here
            # Do something, e.g. 
            # drop any columns containing rows with `NaN`
            # to make the df really empty
            df = df.dropna(how='all', axis=1)
        df
Out[6]: Empty DataFrame
        Columns: []
        Index: []

# Testing shows it is indeed empty now
In [7]: len(df.columns)
Out[7]: 0

Agregar una nueva serie de datos funciona como se esperaba sin que vuelvan a aparecer columnas vacías (de hecho, sin ninguna serie que contenga filas con solo NaN):

In [8]: df['CC'] = [111, 222, 333]
         df
Out[8]:    CC
         0 111
         1 222
         2 333
In [9]: len(df.columns)
Out[9]: 1
Sven Haile avatar Jan 02 '2019 16:01 Sven Haile

Prefiero ir por el camino largo. Estas son las comprobaciones que sigo para evitar el uso de una cláusula try-except:

  1. comprobar si la variable no es Ninguna
  2. luego verifique si es un marco de datos y
  3. asegúrate de que no esté vacío

Aquí DATAestá la variable sospechosa:

DATA is not None and isinstance(DATA, pd.DataFrame) and not DATA.empty
fixxxer avatar Aug 20 '2015 13:08 fixxxer