У меня есть двухкадровый dataframe, и я намерен преобразовать его в словарь python - первый столбец будет ключевым, а вторым будет значение. Заранее спасибо.
Dataframe:
id value
0 0 10.2
1 1 5.7
2 2 7.4
У меня есть двухкадровый dataframe, и я намерен преобразовать его в словарь python - первый столбец будет ключевым, а вторым будет значение. Заранее спасибо.
Dataframe:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Смотрите документы для to_dict
. Вы можете использовать его следующим образом:
df.set_index('id').to_dict()
И если у вас есть только один столбец, чтобы избежать имени столбца, это также уровень в dict (фактически, в этом случае вы используете Series.to_dict()
):
df.set_index('id')['value'].to_dict()
Если вы хотите простой способ сохранить дубликаты, вы можете использовать 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]}
mydict = dict(zip(df.id, df.value))
Ответы joris в этой теме и punchagan в дублированном потоке очень элегантны, однако они не дадут правильных результатов, если столбец, используемый для ключей, содержит любое дублирующее значение.
Например:
>>> 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}
Если у вас есть дублированные записи и вы не хотите их потерять, вы можете использовать этот уродливый, но рабочий код:
>>> 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]}
Другое (немного более короткое) решение для не проигрывания повторяющихся записей:
>>> 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]}