【问题标题】:Normalize json data per level标准化每个级别的 json 数据
【发布时间】:2020-08-26 01:15:37
【问题描述】:

我正在努力规范从 coinmarketcap.com 导入的 json 文件。 Here's one of the json files,如果你想检查一下。

如果我了解如何正确使用pd.json_normalize,我需要专门指出要转换为列:值的索引:值(使用索引名称)。但在这种情况下,第二层是一个变量——资产/加密货币的名称——它会随着每个新的数据块而变化(例如,在“BTC”、“ETH”、“LTC”等之间,该层的名称会发生​​变化)。但是,以下级别(每个资产中的级别)具有相同的结构,因此我想在单个相关列中对它们进行规范化,而不是仅仅因为第二级别(资产名称)不同而创建不同的列。

"status": {
    "timestamp": "2020-08-25T22:24:16.060Z",
    "error_code": 0,
},
"data": {
    "BTC": {
        "symbol": "BTC",
        "max_supply": 21000000,
         "quote": {
            "EUR": {
                "price": 9623.527026340924,
                "volume_24h": 21958302582.89148
            }
        }
    },
    "ETH": {
        "symbol": "ETH",
        "max_supply": null,
        "quote": {
            "EUR": {
                "price": 324.44292007109146,
                "volume_24h": 10492469772.346445,
            }
        }
    }

因此,从上面的示例中,我想创建一个数据框,其中包含单列“符号”、单列“价格”(理想情况下是“欧元价格”)等 - 并且每个资产的相应值位于相同的相关列(然后我会有一个带有资产名称的列以便能够区分它们)。

ASSET - SYMBOL - EUR-PRICE 
BTC - BTC - 999,99
ETH - ETH - 888,88

但是如果我尝试df = pd.json_normalize(json_data),我最终会得到一个只有一行的df,每个字段本身都会变成一整列。为了能够指定“路径”——即pandas.json_normalize(data, record_path)——我需要定义一个特定的二级名称,而不是能够使用动态变量(不同的资产名称)。

我们将不胜感激任何帮助。特别是,有没有办法根据它们在 json 数据中的级别位置来定义将哪些值添加到某个列? (希望问题不要太混乱)????

【问题讨论】:

    标签: python json pandas


    【解决方案1】:
    1. 使用理解将dict 转换为list
    2. 两次json_normalize()第一次通过爆炸列表

    生成 5 行 33 列的数据框

    import json
    
    with open("cmc_test_file.json") as f: d = json.load(f)
    d["data"] = [d["data"][k] for k in d["data"].keys()]
    pd.json_normalize(pd.json_normalize(d).explode("data").to_dict(orient="records"))
    
    

    【讨论】:

    • 感谢您的快速回复,Rob,很抱歉回复您。效果很好:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2023-04-03
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多