【问题标题】:Converting a pandas dataframe to a nested dict in Python using groupby使用 groupby 将 pandas 数据框转换为 Python 中的嵌套字典
【发布时间】:2021-08-06 21:28:00
【问题描述】:

我在 Python 中有以下数据框:

my_df = pd.DataFrame([["123456", "a", "80", False, "beta", None, None], ["123456", "b", "80", False, "beta", None, None],["7891011", "a", "80", False, "beta", None, None], ["7891011", "b", "80", False, "beta", None, None]], columns = ["device", "variable", "size", "manual", "method","nrow", "ncol"])

>>> my_df.head()
    device variable size  manual method  nrow  ncol
0   123456        a   80   False   beta  None  None
1   123456        b   80   False   beta  None  None
2  7891011        a   80   False   beta  None  None
3  7891011        b   80   False   beta  None  None

我想把它转换成如下嵌套的dict结构:

{
'123456':
     {
     'a': {
          'size': 80,
          'manual': False,
          'method': 'beta',
          'nrow': None,
          'ncol': None
          },
     'b': {
          'size': 80,
          'manual': False,
          'method': 'beta',
          'nrow': None,
          'ncol': None
          }
     },
'7891011':
     {
     'a': {
          'size': 80,
          'manual': False,
          'method': 'beta',
          'nrow': None,
          'ncol': None
          },
     'b': {
          'size': 80,
          'manual': False,
          'method': 'beta',
          'nrow': None,
          'ncol': None
          }
     }
}

我可以轻松地循环遍历变量并使用 pandas 进行一些过滤,但这似乎不是很有效。有没有办法使用df.groupby() 做到这一点?

也许:

my_df.groupby(["device", "variable"]).apply(list).to_dict()

但这会弄乱键名。

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    首先按device(级别1)分组并保留除device 之外的所有列,然后将variable 设置为索引(级别2),最后将所有列转换为dict(级别3)。最后,将整个数据帧转换为字典。

    import json
    
    d = df.groupby("device")[["variable", "size", "manual", "method", "nrow", "ncol"]] \
          .apply(lambda x: x.set_index("variable").to_dict(orient="index")) \
          .to_dict()
    print(json.dumps(d, indent=4, sort_keys=True))
    
    {
        "123456": {
            "a": {
                "manual": false,
                "method": "beta",
                "ncol": null,
                "nrow": null,
                "size": "80"
            },
            "b": {
                "manual": false,
                "method": "beta",
                "ncol": null,
                "nrow": null,
                "size": "80"
            }
        },
        "7891011": {
            "a": {
                "manual": false,
                "method": "beta",
                "ncol": null,
                "nrow": null,
                "size": "80"
            },
            "b": {
                "manual": false,
                "method": "beta",
                "ncol": null,
                "nrow": null,
                "size": "80"
            }
        }
    }
    

    【讨论】:

    • 太棒了!简单明了!
    【解决方案2】:

    使用to_dict将所需的列转换为记录并将记录分配给数据框中的新列,然后将数据框的索引设置为devicevariableunstack再次整形,然后是@987654325 @带方向索引

    c = ['device', 'variable']
    my_df['rec'] = my_df.drop(c, 1).to_dict('r')
    my_df.set_index(c)['rec'].unstack().to_dict('i')
    

    {'123456': {'a': {'size': '80',
                      'manual': False,
                      'method': 'beta',
                      'nrow': None,
                      'ncol': None},
                'b': {'size': '80',
                      'manual': False,
                      'method': 'beta',
                      'nrow': None,
                      'ncol': None}},
     '7891011': {'a': {'size': '80',
                       'manual': False,
                       'method': 'beta',
                       'nrow': None,
                       'ncol': None},
                 'b': {'size': '80',
                       'manual': False,
                       'method': 'beta',
                       'nrow': None,
                       'ncol': None}}}
    

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 2021-11-28
      • 2022-01-07
      • 2021-12-21
      • 2017-03-24
      • 2022-07-21
      • 2021-06-30
      • 2018-06-03
      • 1970-01-01
      相关资源
      最近更新 更多