熊猫数据框到字典

时间:2018-06-23 19:42:23

标签: python pandas dictionary pandas-groupby

给出以下熊猫数据框:

  ColA ColB  ColC
0   a1    t     1
1   a2    t     2
2   a3    d     3
3   a4    d     4

我想得到字典的字典。

但是我只能创建以下内容:

d = {t : [1, 2], d : [3, 4]}

作者:

d = {k: list(v) for k,v in duplicated.groupby("ColB")["ColC"]}

我如何获取字典的字典:

dd = {t : {a1:1, a2:2}, d : {a3:3, a4:4}}

2 个答案:

答案 0 :(得分:11)

您可以先执行groupby + apply步骤。

dd = df.set_index('ColA').groupby('ColB').apply(
    lambda x: x.ColC.to_dict()
).to_dict()

或者,通过dict理解:

dd = {k : g.ColC.to_dict() for k, g in df.set_index('ColA').groupby('ColB')}

print(dd)
{'d': {'a3': 3, 'a4': 4}, 't': {'a1': 1, 'a2': 2}}

答案 1 :(得分:7)

这个答案的重点是表明,有一种简单的方法可以使用标准库中的简单迭代和工具来做到这一点。

通常,我们在Pandas DataFrame上执行许多转换,其中每个转换都调用一个新的Pandas对象的构造。有时这可能是一种直观的进步,并且非常有意义。但是,有时我们会忘记可以使用更简单的工具。我相信这是那些时代之一。我的答案仍然使用Pandas,因为我使用的是Option Explicit Public Sub GetInfo() Dim IE As New InternetExplorer With IE .Visible = True .navigate "http://www.gpsvisualizer.com/geocoder/" While .Busy Or .readyState < 4: DoEvents: Wend .document.querySelector("input[onclick*='this.form.action']").Click ' .document.getElementsByTagName("input")(8).Click Stop '<==Delete me .Quit End With End Sub 方法。

itertuples

其他选择。由于我们要遍历的元组被称为元组,因此我们可以通过其表示的列的名称来访问每个元素。

from collections import defaultdict

d = defaultdict(dict)

for a, b, c in df.itertuples(index=False):
    d[b][a] = c

d = dict(d)

d

{'t': {'a1': 1, 'a2': 2}, 'd': {'a3': 3, 'a4': 4}}