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.
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
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')
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')
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
Vous devez fournir les valeurs iterables en tant que valeurs pour les colonnes Pandas DataFrame:
df2 = pd.DataFrame({'A':[a],'B':[b]})
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 )
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)
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’.
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)
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.
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!
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
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']
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()})