web-dev-qa-db-fra.com

La construction de pandas DataFrame à partir de valeurs dans des variables donne "ValueError: si vous utilisez toutes les valeurs scalaires, vous devez passer un index"

Cela peut être une question simple, mais je ne peux pas comprendre comment faire cela. Disons que j'ai deux variables comme suit.

a = 2
b = 3

Je veux construire un DataFrame à partir de ceci:

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

Cela génère une erreur:

ValueError: si vous utilisez toutes les valeurs scalaires, vous devez passer un index

J'ai essayé ça aussi:

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

Cela donne le même message d'erreur.

261
Nilani Algiriyage

Le message d'erreur indique que si vous transmettez des valeurs scalaires, vous devez transmettre un index. Vous ne pouvez donc pas non plus utiliser de valeurs scalaires pour les colonnes - par exemple. utiliser une liste:

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

ou utilisez des valeurs scalaires et passez un index:

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

Vous pouvez également utiliser pd.DataFrame.from_records, ce qui est plus pratique lorsque vous avez déjà le dictionnaire en main:

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

Vous pouvez également définir un index, si vous le souhaitez, en:

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

Vous devez d'abord créer une série de pandas. La deuxième étape consiste à convertir la série pandas en pandas dataframe.

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

Vous pouvez même fournir un nom de colonne.

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

Vous pouvez essayer d’envelopper votre dictionnaire dans la liste

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

pd.DataFrame([my_dict])

   A  B
0  1  2
17
NewBie

Vous devez fournir les valeurs iterables en tant que valeurs pour les colonnes Pandas DataFrame:

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

Peut-être que Series fournirait toutes les fonctions dont vous avez besoin:

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

DataFrame peut être considéré comme une collection de séries. Vous pouvez donc:

  • Concaténer plusieurs séries dans une trame de données (comme décrit ici )

  • Ajouter une variable de série dans un bloc de données existant ( exemple ici )

6
Rob

J'ai eu le même problème avec les tableaux numpy et la solution est de les aplatir:

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

df = pd.DataFrame(data)
4
MicheleDIncecco

Tu pourrais essayer:

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

Extrait de la documentation sur l’argument 'orient': Si les clés du dict passé doivent être les colonnes du DataFrame résultant, transmettez ‘colonnes’ (par défaut). Sinon, si les clés doivent être des lignes, transmettez ‘index’.

4
Matthew Connell

Si vous avez l'intention de convertir un dictionnaire de scalaires, vous devez inclure un index:

import pandas as pd

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

Bien que l'index ne soit pas nécessaire pour un dictionnaire de listes, la même idée peut être étendue à un dictionnaire de listes:

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)

Bien sûr, pour le dictionnaire de listes, vous pouvez construire le dataframe sans index:

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

La magie des pandas au travail. Toute la logique est dehors.

Le message d'erreur "ValueError: If using all scalar values, you must pass an index" indique que vous devez transmettre un index.

Cela ne signifie pas nécessairement que passer un index fait pandas do ce que vous voulez qu'il fasse

Lorsque vous transmettez un index, pandas considérera vos clés de dictionnaire comme des noms de colonne et les valeurs comme ce que la colonne devrait contenir pour chacune des valeurs de l'index.

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

    A   B
1   2   3

Passer un index plus grand:

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

    A   B
1   2   3
2   2   3
3   2   3
4   2   3

Un index est généralement généré automatiquement par une image de données quand aucun élément n'est fourni. Cependant, pandas ne sait pas combien de lignes de 2 et 3 vous voulez. Vous pouvez cependant être plus explicite à ce sujet

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

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

L'index par défaut est 0 basé cependant.

Je recommanderais de toujours passer un dictionnaire de listes au constructeur dataframe lors de la création de dataframes. C'est plus facile à lire pour les autres développeurs. Pandas présente de nombreuses réserves, ne faites pas en sorte que les autres développeurs aient recours à des experts pour la lecture de votre code.

2
firelynx

En effet, un DataFrame a deux dimensions intuitives: les colonnes et les lignes.

Vous ne spécifiez que les colonnes à l'aide des clés du dictionnaire.

Si vous souhaitez uniquement spécifier des données unidimensionnelles, utilisez une série!

2
danuker

Ceci est un commentaire sur la réponse de @fAx: l'entrée ne doit pas nécessairement être une liste d'enregistrements - il peut s'agir également d'un dictionnaire unique:

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

Ce qui semble être équivalent à:

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

Convertir un dictionnaire en trame de données

col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()

Donner un nouveau nom à la colonne

col_dict_df.columns = ['col1', 'col2']
0
kamran kausar

Si vous avez un dictionnaire, vous pouvez le transformer en un cadre de données pandas avec la ligne de code suivante:

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