python - DataFrame 到嵌套 JSON

标签 python json pandas

我不熟悉 JSON 格式的文件。

我有一个 Pandas DataFrame:

import pandas as pd

df = pd.DataFrame([["A", "2014/01/01", "2014/01/02", "A", -0.0061, "A"],
                   ["A", "2015/07/11", "2015/08/21", "A", 1.50, "A"],
                   ["C", "2016/01/01", "2016/01/05", "U", 2.75, "R"],
                   ["D", "2013/05/19", "2014/09/30", "Q", -100.0, "N"],
                   ["B", "2015/08/22", "2015/09/01", "T", 10.0, "R"]],
                   columns=["P", "Start", "End", "Category", "Value", "Group"]
                 ) 

看起来像这样

   P       Start         End Category     Value Group
0  A  2014/01/01  2014/01/02        A   -0.0061     A
1  A  2015/07/11  2015/08/21        A    1.5000     A
2  C  2016/01/01  2016/01/05        U    2.7500     R
3  D  2013/05/19  2014/09/30        Q -100.0000     N
4  B  2015/08/22  2015/09/01        T   10.0000     R

我知道我可以通过以下方式将其转换为 JSON:

df.to_json("output.json")

但我需要将其转换为嵌套 JSON 格式,如下所示:

{
  "group_list": [
    {
      "category_list": [
        {
          "category": "A",
          "p_list": [
            {
              "p": "A",
              "date_list": [
                {
                  "start": "2014/01/01",
                  "end": "2014/01/02",
                  "value": "-0.0061"
                }
              ]
            },
            {
              "p": "A",
              "date_list": [
                {
                  "start": "2015/07/11",
                  "end": "2015/08/21",
                  "value": "1.5000"
                }
              ]
            }
          ]
        }
      ],
      "group": "A"
    },
    {
      "category_list": [
        {
          "category": "U",
          "p_list": [
            {
              "p": "C",
              "date_list": [
                {
                  "start": "2016/01/01",
                  "end": "2016/01/05",
                  "value": "2.7500"
                }
              ]
            }
          ]
        },
        {
          "category": "T",
          "p_list": [
            {
              "p": "B",
              "date_list": [
                {
                  "start": "2015/08/22",
                  "end": "2015/09/01",
                  "value": "10.000"
                }
              ]
            }
          ]
        }
      ],
      "group": "R"
    },
    {
      "category_list": [
        {
          "category": "Q",
          "p_list": [
            {
              "p": "D",
              "date_list": [
                {
                  "start": "2013/05/19",
                  "end": "2014/09/30",
                  "value": "-100.0000"
                }
              ]
            }
          ]
        }
      ],
      "group": "N"
    }
  ]
}

我考虑过使用 Pandas' groupby功能,但我不太清楚如何将其转换为最终的 JSON 格式。本质上,嵌套首先将具有相同“组”和“类别”列的行分组在一起。然后,就是列出行的问题了。我可以编写一些带有嵌套 for 循环的代码,但我希望有一种更有效的方法来完成此任务。

更新

我还可以通过以下方式操作我的 DataFrame:

df2 = df.set_index(['Group', 'Category', 'P']).stack()

Group  Category  P       
    A      A         A  Start    2014/01/01
                        End      2014/01/02
                        Value       -0.0061
                        Start    2015/07/11
                        End      2015/08/21
                        Value           1.5
    R      U         C  Start    2016/01/01
                        End      2016/01/05
                        Value          2.75
    N      Q         D  Start    2013/05/19
                        End      2014/09/30
                        Value          -100
    R      T         B  Start    2015/08/22
                        End      2015/09/01
                        Value            10

这离我需要去的地方很近,但我不认为有人可以调用 df2.to_json()在这种情况下。

最佳答案

下面的嵌套循环应该会让您非常接近:

import json
from json import dumps

json_dict = {}
json_dict['group_list'] = []
for grp, grp_data in df.groupby('Group'):
    grp_dict = {}
    grp_dict['group'] = grp
    for cat, cat_data in grp_data.groupby('Category'):
        grp_dict['category_list'] = []
        cat_dict = {}
        cat_dict['category'] = cat
        cat_dict['p_list'] = []
        for p, p_data in cat_data.groupby('P'):
            p_data = p_data.drop(['Category', 'Group'], axis=1).set_index('P')
            for d in p_data.to_dict(orient='records'):
                cat_dict['p_list'].append({'p': p, 'date_list': [d]})
        grp_dict['category_list'].append(cat_dict)
    json_dict['group_list'].append(grp_dict)
json_out = dumps(json_dict)
parsed = json.loads(json_out)

结果:

json.dumps(parsed, indent=4, sort_keys=True)

{
    "group_list": [
        {
            "category_list": [
                {
                    "category": "A",
                    "p_list": [
                        {
                            "date_list": [
                                {
                                    "End": "2014/01/02",
                                    "Start": "2014/01/01",
                                    "Value": -0.0061
                                }
                            ],
                            "p": "A"
                        },
                        {
                            "date_list": [
                                {
                                    "End": "2015/08/21",
                                    "Start": "2015/07/11",
                                    "Value": 1.5
                                }
                            ],
                            "p": "A"
                        }
                    ]
                }
            ],
            "group": "A"
        },
        {
            "category_list": [
                {
                    "category": "Q",
                    "p_list": [
                        {
                            "date_list": [
                                {
                                    "End": "2014/09/30",
                                    "Start": "2013/05/19",
                                    "Value": -100.0
                                }
                            ],
                            "p": "D"
                        }
                    ]
                }
            ],
            "group": "N"
        },
        {
            "category_list": [
                {
                    "category": "U",
                    "p_list": [
                        {
                            "date_list": [
                                {
                                    "End": "2016/01/05",
                                    "Start": "2016/01/01",
                                    "Value": 2.75
                                }
                            ],
                            "p": "C"
                        }
                    ]
                }
            ],
            "group": "R"
        }
    ]
}

关于python - DataFrame 到嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35143783/

相关文章:

python - 如何确保与 sqlite 和 NFS 的安全文件同步

javascript - 将 IBM watson API 与 jquery 的 $.ajax 一起使用

javascript - 如何比较json元素并在匹配时将数据显示在多维数组中?

python - Pandas 数据框 to_html : Highlighting table rows

python - 将 IP 排序为数字八位字节集(__not__ 字典顺序)

python - 当我尝试使用 Python 中的字符串格式替换 Python 字符串中的值时出现错误

python - 我如何使用散列和 pickle 来保存/加载对象

python - Flask 应用程序结构中的模块错误

json - Laravel json 响应 : response()->json() or $var->toJson()

python - 字典数据未正确附加到另一个字典