Probando si existe un DataFrame de pandas

3 minutos de lectura

avatar de usuario
j jones

En mi código, tengo varias variables que pueden contener un DataFrame de pandas o nada en absoluto. Digamos que quiero probar y ver si un determinado DataFrame ya se ha creado o no. Mi primer pensamiento sería probarlo así:

if df1:
    # do something

Sin embargo, ese código falla de esta manera:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Me parece bien. Idealmente, me gustaría tener una prueba de presencia que funcione para DataFrame o Python None.

Aquí hay una forma en que esto puede funcionar:

if not isinstance(df1, type(None)):
    # do something

Sin embargo, la prueba de tipo es realmente lenta.

t = timeit.Timer('if None: pass')
t.timeit()
# approximately 0.04
t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
t.timeit()
# approximately 0.4

Ay. Además de ser lento, la prueba de NoneType tampoco es muy flexible.

Una solución diferente sería inicializar df1 como un marco de datos vacío, de modo que el tipo sea el mismo en los casos nulo y no nulo. Entonces podría simplemente probar usando len()o any(), o algo así. Sin embargo, hacer un DataFrame vacío parece un poco tonto y un desperdicio.

Otra solución sería tener una variable indicadora: df1_existsque se establece en False hasta que df1 es creado. Entonces, en lugar de probar df1estaría probando df1_exists. Pero esto tampoco parece tan elegante.

¿Hay una forma mejor y más pitónica de manejar este problema? ¿Me estoy perdiendo algo, o es solo un efecto secundario incómodo de todas las cosas asombrosas de los pandas?

avatar de usuario
piRScuadrado

Opción 1 (mi opción preferida)

Esta es la de @Ami Tavory

Seleccione su respuesta si le gusta este enfoque.

Es Python muy idiomático para inicializar una variable con None luego busca None antes de hacer algo con esa variable.

df1 = None

if df1 is not None:
    print df1.head()

opcion 2

Sin embargo, configurar un marco de datos vacío no es una mala idea.

df1 = pd.DataFrame()

if not df1.empty:
    print df1.head()

Opción 3

Solo inténtalo.

try:
    print df1.head()
# catch when df1 is None
except AttributeError:
    pass
# catch when it hasn't even been defined
except NameError:
    pass

Momento

Cuando df1 está en estado inicializado o no existe en absoluto

ingrese la descripción de la imagen aquí

Cuando df1 es un marco de datos con algo en él

df1 = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde'))
df1

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

  • ¿Puedes agregar tiempos?

    – jezrael

    5 sep 2016 a las 22:33

avatar de usuario
ami sabroso

En mi código, tengo varias variables que pueden contener un DataFrame de pandas o nada en absoluto

La forma pitónica de indicar “nada” es a través de Noney para verificar “no nada” a través de

if df1 is not None:
    ...

No estoy seguro de cuán crítico es el tiempo aquí, pero dado que mediste las cosas:

In [82]: t = timeit.Timer('if x is not None: pass', setup='x=None')

In [83]: t.timeit()
Out[83]: 0.022536039352416992

In [84]: t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')

In [85]: t.timeit()
Out[85]: 0.11571192741394043

Así que comprobando que algo is not Nonetambién es más rápido que el isinstance alternativa.

  • Mi respuesta preferida.

    – piRSquared

    5 sep 2016 a las 22:33

  • df1 debe definirse, sin embargo, de ahí la necesidad de df1 = None como en la respuesta de piRSquared.

    – Skippy el Gran Gourou

    12 de diciembre de 2020 a las 14:55

Si el marco de datos se almacena como un valor de diccionario, puede probar su existencia de esta manera:

import pandas as pd

d = dict()
df = pd.DataFrame()

d['df'] = df

## the 'None' is default but including it for the example
if d.get('df', None) is not None:
    ## get df shape
    print(df.shape)
else:
    print('no df here')

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad