La construcción de pandas DataFrame a partir de valores en variables da “ValueError: Si utiliza todos los valores escalares, debe pasar un índice”

Esta puede ser una pregunta simple, pero no puedo averiguar cómo hacer esto. Digamos que tengo dos variables de la siguiente manera.

a = 2 b = 3 

Quiero construir un DataFrame a partir de esto:

 df2 = pd.DataFrame({'A':a,'B':b}) 

Esto genera un error:

ValueError: si usa todos los valores escalares, debe pasar un índice

Intenté esto también:

 df2 = (pd.DataFrame({'a':a,'b':b})).reset_index() 

Esto da el mismo mensaje de error.

El mensaje de error dice que si está pasando valores escalares, debe pasar un índice. Por lo tanto, tampoco puede usar valores escalares para las columnas, por ejemplo, usar una lista:

 >>> df = pd.DataFrame({'A': [a], 'B': [b]}) >>> df AB 0 2 3 

o usa valores escalares y pasa un índice:

 >>> df = pd.DataFrame({'A': a, 'B': b}, index=[0]) >>> df AB 0 2 3 

También puede usar pd.DataFrame.from_records que es más conveniente cuando ya tiene el diccionario en la mano:

 df = pd.DataFrame.from_records([{ 'A':a,'B':b }]) 

También puede establecer el índice, si lo desea, mediante:

 df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A') 

Necesitas crear una serie de pandas primero. El segundo paso es convertir las series de pandas en el dataframe de pandas.

 import pandas as pd data = {'a': 1, 'b': 2} pd.Series(data).to_frame() 

Incluso puede proporcionar un nombre de columna.

 pd.Series(data).to_frame('ColumnName') 

Debe proporcionar iterables como los valores para las columnas de DataFrame de Pandas:

 df2 = pd.DataFrame({'A':[a],'B':[b]}) 

Tal vez Series le proporcione todas las funciones que necesita:

 pd.Series({'A':a,'B':b}) 

DataFrame se puede considerar como una colección de series, por lo que puede:

  • Concatenar series múltiples en un dataframe (como se describe aquí )

  • Agregar una variable de serie en el dataframe existente ( ejemplo aquí )

Puede intentar envolver su diccionario en la lista

my_dict = {'A':1,'B':2}

pd.DataFrame([my_dict])

  AB 0 1 2 

Tuve el mismo problema con las matrices numpy y la solución es aplanarlas:

 data = { 'b': array1.flatten(), 'a': array2.flatten(), } df = pd.DataFrame(data) 

Esto se debe a que un DataFrame tiene dos dimensiones intuitivas: las columnas y las filas.

Solo estás especificando las columnas usando las claves del diccionario.

Si solo desea especificar datos de una dimensión, use una Serie!

Si pretende convertir un diccionario de escalares, debe incluir un índice:

 import pandas as pd alphabets = {'A': 'a', 'B': 'b'} index = [0] alphabets_df = pd.DataFrame(alphabets, index=index) print(alphabets_df) 

Aunque el índice no es necesario para un diccionario de listas, la misma idea se puede expandir a un diccionario de listas:

 planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']} index = [0, 1, 2] planets_df = pd.DataFrame(planets, index=index) print(planets_df) 

Por supuesto, para el diccionario de listas, puede construir el dataframe sin un índice:

 planets_df = pd.DataFrame(planets) print(planets_df) 

Tu podrías intentar:

 df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index') 

De la documentación sobre el argumento ‘orientar’: si las claves del dictado aprobado deben ser las columnas del dataframe resultante, pase ‘columnas’ (predeterminado). De lo contrario, si las claves deben ser filas, pase ‘índice’.

Este es un comentario a la respuesta de @fAx: la entrada no tiene que ser una lista de registros, también puede ser un solo diccionario:

 pd.DataFrame.from_records({'a':1,'b':2}, index=[0]) ab 0 1 2 

Lo que parece ser equivalente a:

 pd.DataFrame({'a':1,'b':2}, index=[0]) ab 0 1 2 

Pandas de magia en el trabajo. Toda la lógica está fuera.

El mensaje de error "ValueError: If using all scalar values, you must pass an index" Dice que debe pasar un índice.

Esto no significa necesariamente que pasar un índice hace que los pandas hagan lo que usted quiere que haga

Cuando pase un índice, los pandas tratarán sus claves de diccionario como nombres de columna y los valores como lo que la columna debe contener para cada uno de los valores en el índice.

 a = 2 b = 3 df2 = pd.DataFrame({'A':a,'B':b}, index=[1]) AB 1 2 3 

Pasando un índice más grande:

 df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4]) AB 1 2 3 2 2 3 3 2 3 4 2 3 

Un índice es generalmente generado automáticamente por un dataframe cuando no se da ninguno. Sin embargo, los pandas no saben cuántas filas de 2 y 3 quieres. Sin embargo puedes ser más explícito al respecto.

 df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4}) df2 AB 0 2 3 1 2 3 2 2 3 3 2 3 

El índice predeterminado es 0 basado sin embargo.

Recomendaría siempre pasar un diccionario de listas al constructor de marcos de datos al crear marcos de datos. Es más fácil de leer para otros desarrolladores. Pandas tiene muchas advertencias, no hagas que otros desarrolladores tengan expertos en todos ellos para leer tu código.

Si tiene un diccionario, puede convertirlo en un dataframe de pandas con la siguiente línea de código:

 pd.DataFrame({"key": d.keys(), "value": d.values()}) 

Solo pasa el dictado en una lista:

 a = 2 b = 3 df2 = pd.DataFrame([{'A':a,'B':b}])