【问题标题】:Pandas nested dict to dataframe熊猫嵌套字典到数据框
【发布时间】:2023-03-23 09:15:01
【问题描述】:

我有一个像这样的简单嵌套列表:

allFrame= [{'statValues': {'kpi2': 2, 'kpi1': 1}, 'modelName': 'first'},{'statValues': {'kpi2': 4, 'kpi1': 2}, 'modelName': 'second'}, {'statValues': {'kpi2': 3, 'kpi1': 3}, 'modelName': 'third'}]

pd.DataFrame(allFrame)pd.DataFrame.from_dict(allFrame)两者都不起作用,只返回

我怎样才能将 kpi_X 作为列名接收?

我发现Python dict to DataFrame Pandas 做了类似的事情。不过,我相信这个操作应该更简单

【问题讨论】:

    标签: python pandas dictionary nested


    【解决方案1】:

    看来您需要先将这些 dicts 变平。

    首先对列表应用展平功能:

    def flatten_dict(d, prefix='__'):
        def items():
            # A clojure for recursively extracting dict like values
            for key, value in d.items():
                if isinstance(value, dict):
                    for sub_key, sub_value in flatten_dict(value).items():
                        # Key name should imply nested origin of the dict,
                        # so we use a default prefix of __ instead of _ or .
                        yield key + prefix + sub_key, sub_value
                else:
                    yield key, value
        return dict(items())
    

    还要注意 orient=records 的使用,这意味着列表中的每个 dict 都是数据帧中的一行。

    所以:

    l = list(map(flatten_dict, allFrame))
    df = pd.DataFrame.from_dict(l, orient='records')
    

    【讨论】:

    • 映射/展平工作正常。但是,转换为 DF 会导致问题:只能识别索引或列作为 orient。但是删除该选项后它工作得很好。
    【解决方案2】:
    pd.DataFrame(list(allFrame.items()),columns=['modelName','statVlues'])
    

    【讨论】:

    • 请 Bonus Luo 解释一下为什么您认为答案应该可以解决问题。谢谢。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2019-03-26
    • 1970-01-01
    • 2022-11-17
    • 2019-01-11
    相关资源
    最近更新 更多