Construir pandas DataFrame a partir de valores en variables da " ValueError: Si usa 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 como sigue.

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

He intentado esto también:

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

Esto da el mismo mensaje de error.

Author: smci, 2013-07-24

12 answers

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

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

O use valores escalares y pase un índice:

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3
 253
Author: DSM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-24 16:49:48

También puedes usar pd.DataFrame.from_records que es más conveniente cuando ya tienes el diccionario a mano:

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

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

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
 24
Author: fAX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-13 13:26:17

Primero necesitas crear una serie de pandas. El segundo paso es convertir la serie pandas a pandas dataframe.

import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()
 15
Author: MLguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 10:58:47

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

df2 = pd.DataFrame({'A':[a],'B':[b]})
 6
Author: ely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-24 16:49:49

Tal vez Series proporcionaría todas las funciones que necesita:

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

DataFrame puede considerarse como una colección de Series, por lo tanto, puede:

  • Concatenar varias Series en un marco de datos (como se describe aquí )

  • Agregue una variable de serie al marco de datos existente ( ejemplo aquí )

 6
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:28

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

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

Si solo desea especificar datos unidimensionales, utilice una Serie!

 3
Author: danuker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 13:53:46

Si tiene la intención de 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 ampliar 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)
 3
Author: k0L1081,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-30 19:34:20

Tuve el mismo problema con los arrays numpy y la solución es aplanarlos:

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

df = pd.DataFrame(data)
 3
Author: MicheleDIncecco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-04 11:16:42

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])
   a  b
0  1  2

Que parece ser equivalente a:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2
 1
Author: S.V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 15:12:31

Puedes intentar:

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

De la documentación sobre el argumento 'orient': Si las claves del dict pasado deben ser las columnas del DataFrame resultante, pase 'columns' (por defecto). De lo contrario, si las claves deben ser filas, pase 'index'.

 0
Author: Matthew Connell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 02:02:03

Si tienes un diccionario puedes convertirlo en un marco de datos pandas con la siguiente línea de código:

pd.DataFrame({"key": d.keys(), "value": d.values()})
 -1
Author: ingrid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 14:53:03

Simplemente pasa el dictado en una lista:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
 -1
Author: LeandroHumb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 12:36:24