Pandas MultiIndex dataframe to nested json

Solution 1:

Use nested list comprehension for add custom format of inner dicts:

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
        }]
    }
}