Construire une DataFrame de pandas à partir des valeurs des variables donne "ValueError: si vous utilisez toutes les valeurs scalaires, vous devez passer un index"
C'est peut-être une question simple, mais je ne sais pas comment faire. Disons que j'ai deux variables comme suit.
a = 2
b = 3
je veux construire une base de données à 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 indice
j'ai essayé aussi:
df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()
Cela donne le même message d'erreur.
12 réponses
le message d'erreur indique que si vous passez des valeurs scalaires, vous devez passer un index. Vous pouvez donc soit ne pas 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 utiliser des valeurs scalaires et passer un indice:
>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
A B
0 2 3
vous pouvez aussi utiliser pd.DataFrame.from_records
ce qui est plus pratique quand vous avez déjà le dictionnaire en main:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }])
vous pouvez également définir index, si vous voulez, par:
df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')
vous devez d'abord créer une série pandas. La deuxième étape consiste à convertir la série pandas en DataFrame pandas.
import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()
vous devez fournir des itérables comme les valeurs pour les colonnes de DataFrame de Pandas:
df2 = pd.DataFrame({'A':[a],'B':[b]})
peut-être que la série 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 donc vous pouvez:
-
regrouper plusieurs séries en une seule base de données (comme décrit ici )
-
ajouter une variable de série dans la base de données existante ( exemple ici )
c'est parce qu'une base de données a deux dimensions intuitives - les colonnes et les lignes.
vous ne spécifiez les colonnes qu'en utilisant les touches du dictionnaire.
si vous voulez seulement spécifier des données unidimensionnelles, utilisez une série!
Si vous avez l'intention de convertir un dictionnaire de scalaires, vous devez inclure un indice:
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 requis 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 des listes, vous pouvez construire la base de données sans index:
planets_df = pd.DataFrame(planets)
print(planets_df)
j'ai eu le même problème avec les tableaux vides et la solution est de les aplatir:
data = {
'b': array1.flatten(),
'a': array2.flatten(),
}
df = pd.DataFrame(data)
Ceci est un commentaire à la réponse de @fAx: entrée ne doit pas être une liste d'enregistrements, il peut être un seul dictionnaire ainsi:
pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
a b
0 1 2
Qui semble être l'équivalent de:
pd.DataFrame({'a':1,'b':2}, index=[0])
a b
0 1 2
Vous pouvez essayer:
df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')
de la documentation sur l'argument "orient": si les touches du dict passé doivent être les colonnes du datagramme résultant, passez ‘columns’ (par défaut). Sinon, si les clés doivent être des lignes, passez ‘index’.
si vous avez un dictionnaire, vous pouvez le transformer en une base de données pandas avec la ligne de code suivante:
pd.DataFrame({"key": d.keys(), "value": d.values()})
passez simplement le dict sur une liste:
a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])