将嵌套的 dict 列表展平为 Pandas Dataframe

Posted

技术标签:

【中文标题】将嵌套的 dict 列表展平为 Pandas Dataframe【英文标题】:Flatten nested list of dict into Pandas Dataframe 【发布时间】:2018-12-11 12:00:27 【问题描述】:

我正在阅读下面的 json 结构

"response":
    "GDUEACWF":
        "2018-06-01":
            ["groupwide_market":"Developed Markets",
            "weights":0.8794132316432903,
            "groupwide_market":"Developed Markets",
            "weights":0.8794132316432903],
        "2018-06-02":
            ["groupwide_market":"Developed Markets",  
            "weights":0.8794132316432903,
            "groupwide_market":"Developed Markets",
            "weights":0.8794132316432903]

并尝试将其展平为以下格式的 Pandas 数据框。

|data_date  |groupwide_market  |weights
|2018-06-01 |Developed Markets |0.08794132316432903

我尝试通过使用以下代码遍历每个 k,v 对中的每个列表来做到这一点。它确实有效,但是它也很慢。生成 10 万行数据需要 30 多分钟。

df = pd.DataFrame()
#concatenating each line of the list within each dict cell
for k1,v1 in data['response'][mnemonic].items():
    for ele in v1:
        df_temp = pd.concat(k2: pd.Series(v2) for k2, v2 in ele.items()).transpose()
        df_temp['data_date'] = k1
        df = df.append(df_temp,ignore_index=True)
df.columns = [x[0] for x in df.columns]

我想知道是否有更有效的方法来做到这一点?尝试阅读 json_normalize 的文档和示例,但无法确定在这种情况下应用它。

提前致谢!!

【问题讨论】:

【参考方案1】:

给定字典为data,我们可以进行如下操作:

import pandas as pd
pd.DataFrame([(date, *nodes.values()) for info in data["response"].values()
              for date, values in info.items() for nodes in values],
              columns=["date", "market", "weight"])

使用给定的响应作为输入,输出如下:

【讨论】:

以上是关于将嵌套的 dict 列表展平为 Pandas Dataframe的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的 Json 文件展平为 Pandas 数据框

如何将包含嵌套列表的字典列表转换为 pandas df

将嵌套列表展平为 1 深列表

如何将 Pandas DataFrame 中的字典列表展平为几列?

将嵌套的 MongoDB 导入到 Pandas

将嵌套命名元组的列表展平为字典列表