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