Transforming Pandas pivot-table to multiple arrays of objects

Question:

I have a Pandas pivot table; The goal is to pass this to a Django rest framework in the form of multiple arrays which I can easily filter in React JavaScript.

pivot:

                                x            y        z
Magazine      date
M1            2018-01           173          68       10
              2018-02           184          55       11

M2            2018-01           175          68       10
              2018-02           189          52       9

I need the output to be:

{
    "M1": [
           {
            "date": "2018-01",
            "x": 173,
            "y": 68,
            "z": 10},
           {
            "date": "2018-02",
            "x": 184,
            "y": 55,
            "z": 11}
          ],

    "M2": [
           {
            "date": "2018-01",
            "x": 175,
            "y": 68,
            "z": 10},
           {
            "date": "2018-02",
            "x": 189,
            "y": 52,
            "z": 9}
          ]
}
Asked By: newuser1628

||

Answers:

Try:

out = {}
for (m, d), row in df.iterrows():
    out.setdefault(m, {}).setdefault(d, {})
    out[m][d] = dict(row)

out = {k: [{kk: vv} for kk, vv in v.items()] for k, v in out.items()}
print(out)

Prints:

{
    "M1": [
        {"2018-01": {"x": 173, "y": 68, "z": 10}},
        {"2018-02": {"x": 184, "y": 55, "z": 11}},
    ],
    "M2": [
        {"2018-01": {"x": 175, "y": 68, "z": 10}},
        {"2018-02": {"x": 189, "y": 52, "z": 9}},
    ],
}
Answered By: Andrej Kesely

df.to_dict()

data = {
    "M1": [
        {"2018-01": {
            "x": 173,
            "y": 68,
            "z": 10}},
        {"2018-02": {
            "x": 184,
            "y": 55,
            "z": 11}}
    ],

    "M2": [
        {"2018-01": {
            "x": 175,
            "y": 68,
            "z": 10}},
        {"2018-02": {
            "x": 189,
            "y": 52,
            "z": 9}}
    ]
}

df = pd.DataFrame(data)
data1 = df.to_dict()

print(data['M1'][0]['2018-01']['z'])
print(data1['M1'][0]['2018-01']['z'])
Answered By: arasemco