1

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}
          ]
}
newuser1628
  • 109
  • 9

2 Answers2

1

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

EDIT: With new output:

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

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

Prints:

{
    "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},
    ],
}
Andrej Kesely
  • 168,389
  • 15
  • 48
  • 91
0

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'])
Aram SEMO
  • 146
  • 8