将熊猫数据框转换为 JSON 对象列

我有一个熊猫数据框,其中包含有关具有多个订单的用户的信息,并且在每个订单中都有多个商品购买。数据框格式示例:


user_id | order_num | item_id | item_desc 

    1        1         1         red

    1        1         2         blue

    1        1         3         green

我想将它转换为列中的 JSONb 对象,以便我可以在 postgresql 中查询它。目前我正在使用以下代码:


j = (reg_test.groupby(['user_id', 'order_num'], as_index=False)

             .apply(lambda x: x[['item_id','item_desc']].to_dict('r'))

             .reset_index()

             .rename(columns={0:'New-Data'})

             .to_json(orient='records'))

这是我得到的结果:


'''

[

          {

            "New-Data": [

              {

                "item_id": "1",

                "item_desc": "red",

              },

              {

                "item_id": "2",

                "item_desc": "blue",

              },

              {

                "item_id": "3",

                "item_desc": "green",

              }

            ],

            "order_number": "1",

            "user_id": "1"

          }

        ]

'''

虽然这是正确的 json 格式,但我希望结果如下所示:


'''


[

  {

    "New-Data": [{

"1":

      {

        "item_id": "1",

        "item_desc": "red",

      },

"2": {

        "item_id": "2",

        "item_desc": "blue",

      },

"3":

      {

        "item_id": "3",

        "item_desc": "green",

      }

     }

    ],

    "order_number": "1",

    "user_id": "1"

  }

]

'''


一只名叫tom的猫
浏览 210回答 2
2回答

幕布斯6054654

作为@rpanai 解决方案的替代方案,我将处理转移到 vanilla python 中:将数据帧转换为 dict :M = df.to_dict("records")为项目创建字典items = [         {key: value          for key, value in entry.items()          if key not in ("user_id", "order_num")}         for entry in M        ]item_details = [{str(num + 1): entry}                for num, entry                in enumerate(items)]print(item_details)[{'1': {'item_id': 1, 'item_desc': 'red'}}, {'2': {'item_id': 2, 'item_desc': 'blue'}}, {'3': {'item_id': 3, 'item_desc': 'green'}}]初始化dict并添加剩余数据d = dict()d['New-Data'] = item_detailsd['order_number'] = M[0]['order_num']d['user_id'] = M[0]['user_id']wrapper = [d]print(wrapper)[{'New-Data': [{'1': {'item_id': 1, 'item_desc': 'red'}},   {'2': {'item_id': 2, 'item_desc': 'blue'}},   {'3': {'item_id': 3, 'item_desc': 'green'}}],  'order_number': 1,  'user_id': 1}]

ibeautiful

您是否考虑过使用自定义功能import pandas as pddf = pd.DataFrame({'user_id': {0: 1, 1: 1, 2: 1}, 'order_num': {0: 1, 1: 1, 2: 1}, 'item_id': {0: 1, 1: 2, 2: 3}, 'item_desc': {0: 'red', 1: 'blue', 2: 'green'}})out = df.groupby(['user_id', 'order_num'])[["item_id", "item_desc"]]\        .apply(lambda x: x.to_dict("records"))\        .apply(lambda x: [{str(l["item_id"]):l for l in x}])\        .reset_index(name="New-Data")\        .to_dict("records")在哪里out返回[{'user_id': 1,  'order_num': 1,  'New-Data': [{'1': {'item_id': 1, 'item_desc': 'red'},    '2': {'item_id': 2, 'item_desc': 'blue'},    '3': {'item_id': 3, 'item_desc': 'green'}}]}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python