【问题标题】:Pandas MultiIndex dataframe to nested jsonPandas MultiIndex 数据框到嵌套 json
【发布时间】:2022-01-20 11:07:41
【问题描述】:

我有以下 pandas 多索引数据框,我希望它成为嵌套的 json 对象。

import pandas as pd

data = {'store_id' : ['1', '1','1','2','2'],
        'item_name' : ['apples', 'oranges', 'pears', 'persimmons', 'bananas'],
        '2022-01-01': [2.33, 1.99, 2.33, 2.33, 4.21],
        '2022-01-02': [2.38, 1.96, 2.38, 2.37, 4.34],
        '2022-01-03': [2.45, 1.78, 2.45, 2.45, 4.13]}
        
df = pd.DataFrame(data).groupby(['store_id', 'item_name']).first()

print(df)

输出:

# The indices are store_id and item_name.

store_id    item_name    2022-01-01 2022-01-02  2022-01-03          
       1       apples       2.33          2.38        2.45
              oranges       1.99          1.96        1.78
                pears       2.33          2.38        2.45
       2      bananas       4.21          4.34        4.13
           persimmons       2.33          2.37        2.45

我希望它成为一个嵌套层次的 json 对象,如下所示:

{
  1: {
    apples: [
      { date: "2022-01-01", price: 2.33 },
      { date: "2022-01-02", price: 2.38 },
      { date: "2022-01-03", price: 2.45 },
    ],
    oranges: [
      { date: "2022-01-01", price: 1.99 },
      { date: "2022-01-02", price: 1.96 },
      { date: "2022-01-03", price: 1.78 },
    ],
    pears: [
      { date: "2022-01-01", price: 2.33 },
      { date: "2022-01-02", price: 2.38 },
      { date: "2022-01-03", price: 2.45 },
    ],
  },

  2: {
    persimmons: [
      { date: "2022-01-01", price: 2.33 },
      { date: "2022-01-02", price: 2.37 },
      { date: "2022-01-03", price: 2.45 },
    ],
    bananas: [
      { date: "2022-01-01", price: 4.21 },
      { date: "2022-01-02", price: 4.34 },
      { date: "2022-01-03", price: 4.13 },
    ],
  },
}

我已经尝试了 pandas 的 to_json 的所有排列,但没有任何东西可以提供我需要的嵌套。

【问题讨论】:

    标签: python pandas dataframe multi-index nested-json


    【解决方案1】:

    使用嵌套列表推导来添加内部字典的自定义格式:

    import json
    
    d = {level: {k1: [{'date': k, 'price': v} 
                 for k, v in v1.items()] 
                 for k1, v1 in df.xs(level).T.items()}
                 for level in df.index.levels[0]}
    
    
    j = json.dumps(d)
    print (j)
    

        '1': {
            'apples': [{
                'date': '2022-01-01',
                'price': 2.33
            }, {
                'date': '2022-01-02',
                'price': 2.38
            }, {
                'date': '2022-01-03',
                'price': 2.45
            }],
            'oranges': [{
                'date': '2022-01-01',
                'price': 1.99
            }, {
                'date': '2022-01-02',
                'price': 1.96
            }, {
                'date': '2022-01-03',
                'price': 1.78
            }],
            'pears': [{
                'date': '2022-01-01',
                'price': 2.33
            }, {
                'date': '2022-01-02',
                'price': 2.38
            }, {
                'date': '2022-01-03',
                'price': 2.45
            }]
        },
        '2': {
            'bananas': [{
                'date': '2022-01-01',
                'price': 4.21
            }, {
                'date': '2022-01-02',
                'price': 4.34
            }, {
                'date': '2022-01-03',
                'price': 4.13
            }],
            'persimmons': [{
                'date': '2022-01-01',
                'price': 2.33
            }, {
                'date': '2022-01-02',
                'price': 2.37
            }, {
                'date': '2022-01-03',
                'price': 2.45
            }]
        }
    }
    

    【讨论】:

    • 这就像一个魅力,在更大的数据集上也非常快。谢谢@jezrael
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2020-12-22
    • 2023-03-07
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多