dictionaries to pandas dataframe

Question:

I’m trying to extract data from dictionaries, here’s an example for one dictionary. Here’s what I have so far (probably not the greatest solution).

def common():
    ab={
        "names": ["Brad", "Chad"],
        "org_name": "Leon",
        "missing": 0.3,
        "con": {
            "base": "abx",
            "conditions": {"func": "**", "ref": 0},
            "results": 4,
        },
        "change": [{"func": "++", "ref": 50, "res": 31},
                   {"func": "--", "ref": 22, "res": 11}]
    }
    data = []
    if "missing" in ab.keys():
        data.append(
            {
                "names": ab["names"],
                "org_name": ab["org_name"],
                "func": "missing",
                "ref": "",
                "res": ab["missing"],
            }
        )
    if "con" in ab.keys():
        data.append(
            {
                "names": ab["names"],
                "org_name": ab["con"]["base"],
                "func": ab["con"]["conditions"]["func"],
                "ref": ab["con"]["conditions"]["ref"],
                "res": ab["con"]["results"],
            }
        )

    df = pd.DataFrame(data)
    print(df)
    return df

Output:

          names org_name     func ref  res
0  [Brad, Chad]     Leon  missing      0.3
1  [Brad, Chad]      abx       **   0  4.0

What I would like the output to look like:

          names org_name     func ref  res
0  [Brad, Chad]     Leon  missing      0.3
1  [Brad, Chad]      abx       **   0    4
2  [Brad, Chad]     Leon       ++  50   31
3  [Brad, Chad]     Leon       --  22   11

The dictionaries can be different length, ultimately a list of several dictionaries will be passed. I’m not sure how to repeat the names and org_name values based on the ref and res values… I don’t want to keep adding row by row, dynamic solution is always preferred.

Asked By: cassio_vr

||

Answers:

Try:

import pandas as pd

ab={
    "names": ["Brad", "Chad"],
    "org_name": "Leon",
    "missing": 0.3,
    "con": {
        "base": "abx",
        "conditions": {"func": "**", "ref": 0},
        "results": 4,
    },
    "change": [{"func": "++", "ref": 50, "res": 31},
               {"func": "--", "ref": 22, "res": 11}]
}

out = []

if 'change' in ab:
    for ch in ab['change']:
        out.append({'names': ab['names'], 'org_name': ab['org_name'], **ch})

if 'con' in ab:
    out.append({'names': ab['names'], 'org_name': ab['con']['base'], **ab['con']['conditions'], 'res': ab['con']['results']})


if 'missing' in ab:
    out.append({'names': ab['names'], 'org_name': ab['org_name'], 'func': 'missing', 'res': ab['missing']})

print(pd.DataFrame(out).fillna(''))

Prints:

          names org_name     func   ref   res
0  [Brad, Chad]     Leon       ++  50.0  31.0
1  [Brad, Chad]     Leon       --  22.0  11.0
2  [Brad, Chad]      abx       **   0.0   4.0
3  [Brad, Chad]     Leon  missing         0.3
Answered By: Andrej Kesely