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!
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.