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