Ho un dataframe a due colonne e intendo convertirlo nel dizionario Python: la prima colonna sarà la chiave e la seconda il valore. Grazie in anticipo.
dataframe:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Ho un dataframe a due colonne e intendo convertirlo nel dizionario Python: la prima colonna sarà la chiave e la seconda il valore. Grazie in anticipo.
dataframe:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Risposte:
Vedi i documenti per to_dict
. Puoi usarlo in questo modo:
df.set_index('id').to_dict()
E se hai solo una colonna, per evitare il nome della colonna è anche un livello nel dict (in realtà, in questo caso usi il Series.to_dict()
):
df.set_index('id')['value'].to_dict()
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
mydict = dict(zip(df.id, df.value))
Se vuoi un modo semplice per conservare i duplicati, potresti usare groupby
:
>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
>>> {k: g["value"].tolist() for k,g in ptest.groupby("id")}
{'a': [1, 2], 'b': [3]}
Le risposte di joris in questo thread e di punchagan nel thread duplicato sono molto eleganti, tuttavia non daranno risultati corretti se la colonna usata per le chiavi contiene un valore duplicato.
Per esempio:
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
# note that in both cases the association a->1 is lost:
>>> ptest.set_index('id')['value'].to_dict()
{'a': 2, 'b': 3}
>>> dict(zip(ptest.id, ptest.value))
{'a': 2, 'b': 3}
Se hai voci duplicate e non vuoi perderle, puoi usare questo codice brutto ma funzionante:
>>> mydict = {}
>>> for x in range(len(ptest)):
... currentid = ptest.iloc[x,0]
... currentvalue = ptest.iloc[x,1]
... mydict.setdefault(currentid, [])
... mydict[currentid].append(currentvalue)
>>> mydict
{'a': [1, 2], 'b': [3]}
mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
Soluzione più semplice:
df.set_index('id').T.to_dict('records')
Esempio:
df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')
Se hai più valori, come val1, val2, val3, ecc e li vuoi come elenchi, usa il codice seguente:
df.set_index('id').T.to_dict('list')
records
significa qui?
records
qui significa ‘records’ : list like [{column -> value}, … , {column -> value}]
Vedi pandas.pydata.org/pandas-docs/stable/reference/api/…
in alcune versioni il codice seguente potrebbe non funzionare
mydict = dict(zip(df.id, df.value))
quindi rendilo esplicito
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
Nota che ho usato id_ perché la parola id è una parola riservata
Puoi usare la "comprensione dettata"
my_dict = {row[0]: row[1] for row in df.values}
Un'altra soluzione (leggermente più breve) per non perdere voci duplicate:
>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
>>> pdict = dict()
>>> for i in ptest['id'].unique().tolist():
... ptest_slice = ptest[ptest['id'] == i]
... pdict[i] = ptest_slice['value'].tolist()
...
>>> pdict
{'b': [3], 'a': [1, 2]}
Ho trovato questa domanda mentre cercavo di creare un dizionario con tre colonne di un dataframe dei panda. Nel mio caso il dataframe ha le colonne A, B e C (diciamo che A e B sono le coordinate geografiche di longitudine e latitudine e C la regione / stato / ecc del paese, che è più o meno il caso).
Volevo un dizionario con ogni coppia di valori A, B (chiave del dizionario) corrispondente al valore di C (valore del dizionario) nella riga corrispondente (ogni coppia di valori A, B è garantita come unica a causa del filtraggio precedente, ma lo è possibile avere lo stesso valore di C per diverse coppie di valori A, B in questo contesto), quindi ho fatto:
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
Usare i panda to_dict () funziona anche:
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(nessuna delle colonne A o B è stata utilizzata come indice prima di eseguire la riga di creazione del dizionario)
Entrambi gli approcci sono veloci (meno di un secondo su un dataframe con 85.000 righe, laptop dual-core veloce di 5 anni).
I motivi per cui sto postando questo:
def get_dict_from_pd(df, key_col, row_col):
result = dict()
for i in set(df[key_col].values):
is_i = df[key_col] == i
result[i] = list(df[is_i][row_col].values)
return result
questa è la mia mossa, un ciclo di base