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


296

¿Cómo verificar si un panda DataFrameestá vacío? En mi caso quiero imprimir algún mensaje en la terminal si DataFrameestá vacío.


2
len () no funciona? Debería devolver 0 para el marco de datos vacío.
VIKASH JAISWAL

Respuestas:


462

Puede usar el atributo df.emptypara verificar si está vacío o no:

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

Fuente: Documentación de Pandas


3
Esto parece una pena, ya que necesita saber que df es un pd.DataFrame. Me gustaría saber la motivación para no implementar bool () en pd.DataFrame.
Quant

17
@Quant: la documentación tiene una discusión sobre por qué bool genera un error para un marco de datos aquí: enlace . Cita: "¿Debería ser cierto porque no es de longitud cero? ¿Falso porque hay valores falsos? No está claro, así que, en cambio, los pandas generan un ValueError"
Bij

56

Yo uso la lenfunción Es mucho más rápido que empty. len(df.index)Es aún 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
'''

77
Un DataFrame puede estar vacío debido a len (df.index) == 0 o len (df.columns) == 0 también.
Mark Horvath el

9

Prefiero ir por la ruta larga. Estas son las comprobaciones que sigo para evitar el uso de una cláusula try-except

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

Aquí DATAestá la variable sospechosa:

DATA is not None and isinstance(DATA, pd.DataFrame) and not DATA.empty

2
Esto es redundante y una mala práctica si se espera que la variable sea un DataFrame (que es lo que implica el OP) que está vacío o tiene filas. Si no es un DF (o si no es ninguno), se debe lanzar una excepción ya que algo salió mal en alguna parte.
fgblomqvist

En Python, try/exceptes barato y ifes caro. Python no es Java ni C; aquí es más fácil pedir perdón que permiso
Nick Marinakis

4

Parece que la definición aceptada de vacío en este hilo es un marco de datos con solo cero filas. Pero hay una distinción entre un marco de datos vacío con cero filas y cero columnas y un marco de datos vacío con cero filas y al menos una columna . En cada caso, la longitud del índice es 0 y vacía = Verdadero como se muestra aquí:

Ejemplo 1: 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)
Out[2]: 0

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

Ejemplo 2: marco de datos vacío con 0 filas y al menos 1 columna

In [4]: df2 = pd.DataFrame({'AA' : [], 'BB' : []})
        df2
Out[4]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

In [5]: len(df2.index)
Out[5]: 0

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

Una forma de distinguir entre un marco de datos que está vacío de encabezados y datos o simplemente vacío de datos es probar la longitud del índice de la columna . El primer marco de datos cargado devuelve cero columnas, el segundo marco de datos devuelve el número de columnas vacías.

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

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

-1
1) Si un DataFrame tiene valores Nan y no nulos y desea saber si el DataFrame
está vacío o no, intente este código.
2) cuando esta situación puede suceder? 
Esta situación ocurre cuando se usa una sola función para trazar más de un DataFrame 
que se pasan como parámetro. En tal situación, la función intenta trazar los datos incluso 
cuando un DataFrame está vacío y, por lo tanto, traza una figura vacía.
Tendrá sentido si simplemente muestra el mensaje 'DataFrame no tiene datos'.
3) ¿por qué? 
si un DataFrame está vacío (es decir, no contiene ningún dato. Mírelo DataFrame con valores Nan 
se considera no vacío), entonces es deseable no trazar, sino enviar un mensaje:
Supongamos que tenemos dos DataFrames df1 y df2.
La función myfunc toma cualquier DataFrame (df1 y df2 en este caso) e imprime un mensaje 
si un DataFrame está vacío (en lugar de trazar):
df1                     df2
col1 col2           col1 col2 
Nan   2              Nan  Nan 
2     Nan            Nan  Nan  

y la función:

def myfunc(df):
  if (df.count().sum())>0: ##count the total number of non Nan values.Equal to 0 if DataFrame is empty
     print('not empty')
     df.plot(kind='barh')
  else:
     display a message instead of plotting if it is empty
     print('empty')

Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación, y probablemente resultaría en más votos positivos. Recuerde que está respondiendo la pregunta para los lectores en el futuro, no solo la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos. De la opinión
doble pitido
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.