【问题标题】:Pandas dataframe to dict of dictPandas 数据框到 dict 的 dict
【发布时间】:2018-12-02 21:49:48
【问题描述】:

给定以下 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]}

作者:

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

如何获取dict的dict:

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

【问题讨论】:

    标签: python pandas dictionary pandas-groupby


    【解决方案1】:

    您可以事先使用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}}
    

    【讨论】:

      【解决方案2】:

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

      我们经常在 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}}
      

      【讨论】:

        猜你喜欢
        • 2021-04-22
        • 2021-10-06
        • 2016-12-20
        • 2019-08-12
        • 2017-05-02
        • 1970-01-01
        • 2019-09-27
        • 2018-08-11
        • 1970-01-01
        相关资源
        最近更新 更多