Configuración de columnas para un dataframe de pandas vacío

Esto es algo que me confunde …

import pandas as pd # this works fine df1 = pd.DataFrame(columns=['A','B']) # but let's say I have this df2 = pd.DataFrame([]) # this doesn't work! df2.columns = ['A','B'] # ValueError: Length mismatch: Expected axis has 0 elements, new values have 2 elements 

¿Por qué no funciona esto? ¿Qué puedo hacer en su lugar? ¿Es la única manera de hacer algo como esto?

 if len(df2.index) == 0: df2 = pd.DataFrame(columns=['A','B']) else: df2.columns = ['A','B'] 

Debe haber una forma más elegante.

¡Gracias por tu ayuda!

Actualización del 19/04/2015

Alguien preguntó por qué hacer esto en absoluto:

 df2 = pd.DataFrame([]) 

La razón es que en realidad estoy haciendo algo como esto:

 df2 = pd.DataFrame(data) 

… donde los datos pueden estar en una lista vacía de listas, pero en la mayoría de los casos no lo es. Así que sí, podría hacer:

 if len(data) > 0: df2 = pd.DataFrame(data, columns=['A','B']) else: df2 = pd.DataFrame(columns=['A','B']) 

… pero esto no parece muy seco (y ciertamente no conciso).

Hazme saber si tienes alguna pregunta. ¡Gracias!

Esto parece un error en los pandas. Todos estos trabajos:

 pd.DataFrame(columns=['A', 'B']) pd.DataFrame({}, columns=['A', 'B']) pd.DataFrame(None, columns=['A', 'B']) 

pero no esto:

 pd.DataFrame([], columns=['A', 'B']) 

Hasta que se arregle, sugiero algo como esto:

 if len(data) == 0: data = None df2 = pd.DataFrame(data, columns=['A','B']) 

o:

 df2 = pd.DataFrame(data if len(data) > 0 else None, columns=['A', 'B']) 

Actualización: a partir de la versión 0.16.1 de Pandas , el paso de data = [] funciona:

 In [85]: df = pd.DataFrame([], columns=['a', 'b', 'c']) In [86]: df Out[86]: Empty DataFrame Columns: [a, b, c] Index: [] 

así que la mejor solución es actualizar tu versión de Pandas.


Si los data son una lista vacía de listas, entonces

 data = [[]] 

Pero entonces len(data) sería igual a 1, por lo que len(data) > 0 no es la condición correcta para verificar si los data son una lista vacía de listas.

Hay una serie de valores para los data que podrían hacer

 pd.DataFrame(data, columns=['A','B']) 

elevar una excepción. Se genera un error AssertionError o ValueError si los data iguales a [] (sin datos), [[]] (sin columnas), [[0]] (una columna) o [[0,1,2]] (demasiadas columnas). Entonces, en lugar de intentar verificar todos estos, creo que es más seguro y más fácil de usar, try..except aquí:

 columns = ['A', 'B'] try: df2 = pd.DataFrame(data, columns=columns) except (AssertionError, ValueError): df2 = pd.DataFrame(columns=columns) 

Sería bueno si hubiera una forma SECA de escribir esto, pero dado que es responsabilidad de la persona que llama verificar esto , no veo una mejor manera.