pythonpandas数据框到字典

我有一个两列的数据框,并打算将其转换为Python字典 – 第一列将是关键,第二将是价值。 先谢谢你。

dataframe:

id value 0 0 10.2 1 1 5.7 2 2 7.4 

请参阅to_dict的文档。 你可以像这样使用它:

 df.set_index('id').to_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]} 

另一个(略短)解决scheme,不会丢失重复条目:

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