Export JSON from dataframe in Pandas

Question:

I have a dataframe like this

A B tc-01 tc-02
bapc act 1 1
bapc bp 2 2
bapc ly 3 3
bapc vsLy 4 4
bapc bsBp 5 5
nsr act 6 6
nsr bp 7 7
nsr ly 8 8
nsr vsLy 9 9
nsr bsBp 10 10

How can I export dataframe to the json file like this

{               
    "expect": {         
        "tc-01": {      
            "bapc":{    
                "act":1,
                "bp":2,
                "ly":3,
                "vsLy":4,
                "bsBp":5
            },  
            "nsr":{ 
                "act":6,
                "bp":7,
                "ly":8,
                "vsLy":9,
                "bsBp":10
            }
        },
        "tc-02": {      
            "bapc":{    
                "act":1,
                "bp":2,
                "ly":3,
                "vsLy":4,
                "bsBp":5
            },  
            "nsr":{ 
                "act":6,
                "bp":7,
                "ly":8,
                "vsLy":9,
                "bsBp":10
            }
        }
    }           
}
Asked By: Dung Pham

||

Answers:

Try something like this:

df.melt(['A', 'B']).set_index(['variable', 'A', 'B'])
  .unstack('B')['value'].groupby('variable')
  .apply(lambda x: x.droplevel(0).to_dict('index')).to_dict()

Output:

{'tc-01': {'bapc': {'act': 1, 'bp': 2, 'bsBp': 5, 'ly': 3, 'vsLy': 4},
  'nsr': {'act': 6, 'bp': 7, 'bsBp': 10, 'ly': 8, 'vsLy': 9}},
 'tc-02': {'bapc': {'act': 1, 'bp': 2, 'bsBp': 5, 'ly': 3, 'vsLy': 4},
  'nsr': {'act': 6, 'bp': 7, 'bsBp': 10, 'ly': 8, 'vsLy': 9}}}
Answered By: Scott Boston

Lets do some reshaping with stack, unstack and pivot

s = df.pivot('A', 'B').stack(0)
s.assign(r=s.to_dict('records'))['r'].unstack().to_dict()

{'tc-01': {'bapc': {'act': 1, 'bp': 2, 'bsBp': 5, 'ly': 3, 'vsLy': 4},
           'nsr': {'act': 6, 'bp': 7, 'bsBp': 10, 'ly': 8, 'vsLy': 9}},
 'tc-02': {'bapc': {'act': 1, 'bp': 2, 'bsBp': 5, 'ly': 3, 'vsLy': 4},
           'nsr': {'act': 6, 'bp': 7, 'bsBp': 10, 'ly': 8, 'vsLy': 9}}}
Answered By: Shubham Sharma

Use itertuples() to loop over the dataframe and build a dictionary iteratively. Iterating with itertuples() is probably the most efficient method for the operation required in the OP as well.

import json
res = {'expect': {}}
for a, b, tc01, tc02 in df.itertuples(index=False):
    # insert the key if it doesn't exist for the inner dicts
    # by using `setdefault()`
    res['expect'].setdefault('tc-01', {}).setdefault(a, {})[b] = tc01
    res['expect'].setdefault('tc-02', {}).setdefault(a, {})[b] = tc02
j_var = json.dumps(res, indent=4)
print(j_var)
{
    "expect": {
        "tc-01": {
            "bapc": {
                "act": 1,
                "bp": 2,
                "ly": 3,
                "vsLy": 4,
                "bsBp": 5
            },
            "nsr": {
                "act": 6,
                "bp": 7,
                "ly": 8,
                "vsLy": 9,
                "bsBp": 10
            }
        },
        "tc-02": {
            "bapc": {
                "act": 1,
                "bp": 2,
                "ly": 3,
                "vsLy": 4,
                "bsBp": 5
            },
            "nsr": {
                "act": 6,
                "bp": 7,
                "ly": 8,
                "vsLy": 9,
                "bsBp": 10
            }
        }
    }
}
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.