you values pass must index from dicts dict all python dictionary pandas

values - marco de datos de python pandas para el diccionario



pandas series from dict (7)

Las respuestas por joris en este hilo y por punchagan en el hilo duplicado son muy elegantes, sin embargo, no darán resultados correctos si la columna utilizada para las claves contiene algún valor duplicado.

Por ejemplo:

>>> 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}

Si tiene entradas duplicadas y no quiere perderlas, puede usar este código feo pero funcional:

>>> 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]}

Tengo un marco de datos de dos columnas, y tengo la intención de convertirlo a un diccionario de Python: la primera columna será la clave y la segunda será el valor. Gracias de antemano.

Marco de datos:

id value 0 0 10.2 1 1 5.7 2 2 7.4


Necesita una lista como valor de diccionario. Este código hará el truco.

from collections import defaultdict mydict = defaultdict(list) for k, v in zip(df.id.values,df.value.values): mydict[k].append(v)


Otra solución (un poco más corta) para no perder entradas duplicadas:

>>> 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]}


Si desea una forma simple de conservar duplicados, puede usar 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]}


Ver los documentos para to_dict . Puedes usarlo así:

df.set_index(''id'').to_dict()

Y si solo tiene una columna, para evitar el nombre de la columna también hay un nivel en el dict (en realidad, en este caso usa Series.to_dict() ):

df.set_index(''id'')[''value''].to_dict()


en algunas versiones, el código siguiente podría no funcionar

mydict = dict(zip(df.id, df.value))

así que hazlo explícito

id_=df.id.values value=df.value.values mydict=dict(zip(id_,value))

Tenga en cuenta que utilicé id_ porque la palabra id es palabra reservada


mydict = dict(zip(df.id, df.value))