Pandas数据框转换为字典的字典

13

以下是一个Pandas数据框:

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

by:

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

我该如何获取字典的字典:
dd = {t : {a1:1, a2:2}, d : {a3:3, a4:4}}
2个回答

11
您可以先使用groupby+apply步骤来完成此操作。
dd = df.set_index('ColA').groupby('ColB').apply(
    lambda x: x.ColC.to_dict()
).to_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}}

10
这篇文章的重点在于展示如何使用简单的迭代和标准库中的工具来完成这个任务。
通常情况下,我们对 Pandas DataFrame 进行许多转换操作,每个操作都会构建一个新的 Pandas 对象。有时这是一种直观的进展并且非常合理。然而,有时候我们忘记了可以使用更简单的工具。我认为这就是其中之一。我的答案仍然使用 Pandas,但我使用了 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}}

略微不同。由于我们迭代的元组是命名元组,因此我们可以通过它表示的列的名称访问每个元素。
from collections import defaultdict

d = defaultdict(dict)

for t in df.itertuples():
    d[t.ColB][t.ColA] = t.ColC

d = dict(d)

d

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接