Hom*_*map 12 python dictionary pandas pandas-groupby
鉴于以下pandas数据框:
ColA ColB ColC
0 a1 t 1
1 a2 t 2
2 a3 d 3
3 a4 d 4
Run Code Online (Sandbox Code Playgroud)
我想要一本字典词典.
但我设法创建了以下内容:
d = {t : [1, 2], d : [3, 4]}
Run Code Online (Sandbox Code Playgroud)
通过:
d = {k: list(v) for k,v in duplicated.groupby("ColB")["ColC"]}
Run Code Online (Sandbox Code Playgroud)
我怎么能得到字典的字典:
dd = {t : {a1:1, a2:2}, d : {a3:3, a4:4}}
Run Code Online (Sandbox Code Playgroud)
cs9*_*s95 11
您可以事先使用groupby+ apply步骤执行此操作.
dd = df.set_index('ColA').groupby('ColB').apply(
lambda x: x.ColC.to_dict()
).to_dict()
Run Code Online (Sandbox Code Playgroud)
或者,通过词典理解:
dd = {k : g.ColC.to_dict() for k, g in df.set_index('ColA').groupby('ColB')}
Run Code Online (Sandbox Code Playgroud)
print(dd)
{'d': {'a3': 3, 'a4': 4}, 't': {'a1': 1, 'a2': 2}}
Run Code Online (Sandbox Code Playgroud)
这个答案的要点是表明通过简单的迭代和标准库中的工具可以直接实现这一点.
通常我们会在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}}
Run Code Online (Sandbox Code Playgroud)
轻微的替代品.由于我们迭代的元组是名为元组,我们可以通过它所代表的列的名称访问每个元素.
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}}
Run Code Online (Sandbox Code Playgroud)