¿Cómo compruebo si un DataFrame de pandas está vacío?
¿ Cómo compruebo si un pandas DataFrame
está vacío? Me gustaría imprimir algún mensaje en la terminal si DataFrame
está vacío.
Puedes usar el atributo df.empty
para comprobar si está vacío o no:
if df.empty:
print('DataFrame is empty!')
Fuente: Documentación de Pandas
Yo uso la len
funció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
'''
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
NaN
lo 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 n
columnas
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
Prefiero ir por el camino largo. Estas son las comprobaciones que sigo para evitar el uso de una cláusula try-except:
- comprobar si la variable no es Ninguna
- luego verifique si es un marco de datos y
- asegúrate de que no esté vacío
Aquí DATA
está la variable sospechosa:
DATA is not None and isinstance(DATA, pd.DataFrame) and not DATA.empty