La creazione di Panda DataFrame dai valori nelle variabili fornisce "ValueError: se si utilizzano tutti i valori scalari, è necessario passare un indice"


370

Questa potrebbe essere una domanda semplice, ma non riesco a capire come farlo. Diciamo che ho due variabili come segue.

a = 2
b = 3

Voglio costruire un DataFrame da questo:

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

Questo genera un errore:

ValueError: se si utilizzano tutti i valori scalari, è necessario passare un indice

Ho provato anche questo:

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

Questo dà lo stesso messaggio di errore.

Risposte:


572

Il messaggio di errore dice che se si passano valori scalari, è necessario passare un indice. Quindi non è possibile utilizzare valori scalari per le colonne, ad esempio utilizzare un elenco:

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

o usa valori scalari e passa un indice:

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

7
Forse perché l'ordine degli elementi in un elenco in Python è persistente, mentre l'ordine degli elementi in un dizionario non lo è. È possibile creare un'istanza di un DataFrame con un dizionario vuoto. In linea di principio suppongo che un DataFrame a riga singola come mostrato qui sarebbe anche ok per costruire da un dizionario perché l'ordine non ha importanza (ma questo non è stato implementato). Tuttavia, con più righe, Panda non sarebbe in grado di creare un DataFrame perché non saprebbe quali elementi appartengono alla stessa riga.
Alexander

2
@VitalyIsaev - In tal caso, la riga del frame di dati (rappresentata dal dizionario dato) non ha indice (nemmeno implicito). Una soluzione semplice è racchiudere il dizionario all'interno di un elenco, che ha "indicizzazione naturale". Si può affermare che se viene fornito un solo dizionario (senza un elenco di wrapping), si può presumere index=0, ma ciò può portare a un uso improprio accidentale (pensando che un singolo dizionario possa in qualche modo creare un frame di dati multi-riga)
Ori

diverse soluzioni in questo link eulertech.wordpress.com/2017/11/28/…
Jason Goal

Il motivo è dovuto al fatto che DataFrames è pensato per contenere dati bidimensionali (ovvero righe delle due variabili di OP). Se vuoi semplicemente tenere un indice -> coppie di valori (come un Dizionario), allora dovresti usare una Serie, come suggerisce Rob .
Danuker,

Questo è un singolo Dataframe campione / riga, quindi index = [0] ha un senso logico; ma potresti anche manipolarlo in modo che sia index = [100], che funziona. D: Index non dovrebbe essere ordinato logicamente in modo incrementale, perché python consente la manipolazione di Index?
Sumanth Lazzaro,

65

Puoi anche usare quello pd.DataFrame.from_recordsche è più conveniente quando hai già il dizionario in mano:

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

Puoi anche impostare l'indice, se lo desideri, tramite:

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

27
Questa risposta non funziona per me - Ottengo lo stesso messaggio di errore quando utilizzo from_records.
Dave Kielpinski,

Dave, hai provato il pezzo di codice (definisci aeb, ovviamente)? Ricevi ancora un messaggio di errore? Puoi pubblicare?
fAX

12
@DaveKielpinski Hai forse dimenticato di aggiungere le parentesi?
Dennis,

Questo utilizzerà le chiavi dict come nomi di colonna. Come impostare le chiavi per indicizzare?
mingchau,

@DaveKielpinski Per favore, controlla se hai passato un elenco al metodo "from_records"; in caso contrario non funzionerà e verrà visualizzato lo stesso messaggio di errore di quando si chiama DataFrame nel dizionario.
Mairan,

55

Devi prima creare una serie di panda. Il secondo passo è convertire la serie Panda in frame di dati Panda.

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

Puoi anche fornire un nome di colonna.

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

1
Questo ha funzionato per me. Il mio dizionario aveva chiavi intere e valori ndarray.
StatsSorceress,

pd.Series(data).to_frame('ColumnName')è più breve, sebbene questo equivalente sia forse più diretto:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
Alex F

29

Puoi provare a inserire il dizionario nell'elenco

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

pd.DataFrame([my_dict])

   A  B
0  1  2

8

Forse Series fornirebbe tutte le funzioni di cui hai bisogno:

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

DataFrame può essere pensato come una raccolta di serie, quindi è possibile:

  • Concatena più serie in un frame di dati (come descritto qui )

  • Aggiungi una variabile Series nel frame di dati esistente ( esempio qui )


7

Devi fornire gli iterabili come valori per le colonne Pandas DataFrame:

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

6

Ho avuto lo stesso problema con gli array intorpiditi e la soluzione è appiattirli:

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

df = pd.DataFrame(data)

3

Se si intende convertire un dizionario di scalari, è necessario includere un indice:

import pandas as pd

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

Sebbene l'indice non sia richiesto per un dizionario di elenchi, la stessa idea può essere espansa in un dizionario di elenchi:

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)

Naturalmente, per il dizionario degli elenchi, è possibile creare il frame di dati senza un indice:

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

3

Puoi provare:

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

Dalla documentazione sull'argomento "orient": se le chiavi del dict passato devono essere le colonne del DataFrame risultante, passare le "colonne" (impostazione predefinita). In caso contrario, se le chiavi devono essere righe, passare "indice".


Utilizzare gli strumenti di formattazione per modificare e formattare correttamente la domanda / risposta. I codici all'interno delle frasi devono essere formattati come code parole molto importanti per essere audaci , con minore importanza. Corsivo Usa anche gli elenchi, se necessario
Morse

Questo non risolve la domanda posta, produce un risultato diverso da quello desiderato.
Ken Williams,

3

Panda magici al lavoro. Tutta la logica è fuori.

Il messaggio di errore "ValueError: If using all scalar values, you must pass an index"indica che è necessario passare un indice.

Questo non significa necessariamente che passare un indice fa fare ai panda quello che vuoi che faccia

Quando si passa un indice, i panda trattano le chiavi del dizionario come nomi di colonna e i valori come ciò che la colonna deve contenere per ciascuno dei valori nell'indice.

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

    A   B
1   2   3

Passando un indice più grande:

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 indice viene generalmente generato automaticamente da un frame di dati quando non ne viene fornito nessuno. Tuttavia, Panda non sa quante righe di 2e 3vuoi. Puoi comunque essere più esplicito al riguardo

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'indice predefinito è basato su 0 però.

Consiglierei di passare sempre un dizionario di elenchi al costruttore di dataframe durante la creazione di dataframe. È più facile da leggere per altri sviluppatori. Pandas ha molti avvertimenti, non costringere gli altri sviluppatori ad esperti in tutti loro per leggere il tuo codice.


3

l'input non deve essere un elenco di record, ma può anche essere un singolo dizionario:

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

Che sembra essere equivalente a:

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

2

Questo perché un DataFrame ha due dimensioni intuitive: le colonne e le righe.

Stai solo specificando le colonne usando le chiavi del dizionario.

Se vuoi solo specificare dati monodimensionali, usa una serie!


0

Converti dizionario in cornice dati

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

Dai un nuovo nome alla colonna

col_dict_df.columns = ['col1', 'col2']

-2

Se hai un dizionario, puoi trasformarlo in un frame di dati Panda con la seguente riga di codice:

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

Funziona, ma IMHO non ha molto senso <code> `<! - lingua: lang-py -> fruits_count = defaultdict (int) fruits_count [" mele "] = 10 fruits_count [" banane "] = 21 pd.DataFrame ({"key": fruits_count.keys (), "value": fruits_count.values ​​()}) Out: valore chiave 0 (banane, mele) (21, 10) 1 (banane, mele) (21, 10) <code>
Emiter

-3

Basta passare il dict su un elenco:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.