Python Pandas使用不相等的键展平JSON

qzwqbdag  于 2023-04-28  发布在  Python
关注(0)|答案(2)|浏览(119)

Python Pandas有很多很好的例子可以用来扁平化JSON,如果Key是相等的。但是我不知道如何将其带入Pandas DataFrame:

{
    "data": {
        "1": {
            "item1": "data1",
            "item2": "data2",
            "item3": {
                "item4": {
                    "item5": "bla1",
                    "item6": "bla2",
                    "item7": "bla3"
                }
            }
        },
        "2": {
            "item1": "data3",
            "item2": "data4",
            "item3": {
                "item4": {
                    "item5": "bla4",
                    "item6": "bla5",
                    "item7": "bla6"
                }
            }
        }
    }
}

问题是一级密钥不相等(1,2,3 ...)。但这是我从API调用中得到的输出。
我想做的是在DataFrame中得到这个结果,而不是使用常见的Python脚本循环JSON。我想,必须有一个简单的Pandas解决方案来解决如何在DF中创建列:

item1 item5 item6 item7
0 1 data1 bla1  bla2  bla3
1 2 data3 bla4  bla5  bla6
cwtwac6a

cwtwac6a1#

你可以试试这个:

df = (pd.DataFrame(obj["data"]).T.reset_index(names="key")
           [["key"]].join(pd.json_normalize(obj["data"]) # `obj`is your json data
           .rename(lambda x: x.split(".")[-1], axis=1)
           .groupby(level=0, axis=1).agg(lambda x: x.values.tolist())
           .apply(pd.Series.explode).reset_index(drop=True))
      )

输出:

print(df)

  key  item1  item2 item5 item6 item7
0   1  data1  data2  bla1  bla2  bla3
1   2  data3  data4  bla4  bla5  bla6
qacovj5a

qacovj5a2#

另一个解决方案,使用递归。(data是你的字典从问题):

def get_kv(o):
    for k, v in o.items():
        if isinstance(v, str):
            yield k, v
        else:
            yield from get_kv(v)

df = pd.DataFrame({"index": k, **dict(get_kv(v))} for k, v in data["data"].items())
print(df)

图纸:

index  item1  item2 item5 item6 item7
0     1  data1  data2  bla1  bla2  bla3
1     2  data3  data4  bla4  bla5  bla6

相关问题