繁体   English   中英

将 pandas dataframe 转换为 JSON Z497031794414A5525435F90151AC3 列

[英]Converting pandas dataframe to JSON Object Column

我有一个 pandas dataframe ,其中包含有关具有多个订单的用户的信息,并且在每个订单中都有多个项目购买。 dataframe 格式的示例:

user_id | order_num | item_id | item_desc 
    1        1         1         red
    1        1         2         blue
    1        1         3         green

我想在列中将其转换为 JSONb Object,以便我可以在 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"
  }
]
'''

作为@rpanai 解决方案的替代方案,我将处理转移到 vanilla python 中:

将 dataframe 转换为字典:

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_details

d['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}]

您是否考虑过使用定制的 function

import pandas as pd

df = 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'}}]}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM