从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是啥?

Posted

技术标签:

【中文标题】从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是啥?【英文标题】:What is the pythonic way to create a Dataframe from a list of Nested Dictionary Structures (with two levels)?从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是什么? 【发布时间】:2021-12-25 01:32:03 【问题描述】:

我收到以下格式的请求(我无法更改输入请求格式):

  "inputs":
    [
       
           "TimeGenerated": "datetimestring",
           "counters": 
               "counter1": float_value,
               "counter2": float_value,
               "counter3": float_value
            
      ,
      
           "TimeGenerated": "datetimestring",
           "counters": 
               "counter1": float_value,
               "counter2": float_value,
               "counter3": float_value
            
      ,
      
           "TimeGenerated": "datetimestring",
           "counters": 
               "counter1": float_value,
               "counter2": float_value,
               "counter3": float_value
           
      
    ]

我想从这个字典中创建一个DataFrame 列:TimeGenerated, counter1, counter2, counter3

从这个嵌套字典列表中创建DataFrame 的最有效的pythonic 方法是什么?


可能的解决方案(不是最有效的)

我找到的解决方案是:

x = []
for i in input_json['inputs']:
        counters = i['counters']                   # We do not want counters in the column headers. This returns the dictionary  "counter1": float_value, "counter2": float_value, "counter3": float_value
        counters['_time'] = i['TimeGenerated']     # The idea to extract it and then add it to the common dictionary. Counters would now be like  "counter1": float_value, "counter2": float_value, "counter3": float_value, "_time": "datetimestring"
        x.append(counters)                         # Create a list of such dictionaries (with single level dictionaries without any nesting)
in_df = pd.DataFrame(x)                            # Create a Dataframe from the list
in_df['_time'] = pd.to_datetime(in_df['_time'])    # To convert datetimestring to datetime.

但是,我相信还有更有效的方法可以实现这一目标!


类似的问题(具有不同的预期最终结果)

*** 上的一些其他问题解决了类似的问题(但预期会产生不同的结果)。添加它们以供在实际搜索另一个最终结果时偶然发现这一点的人细读(此外,将作为一个很好的比较点来使用 Python 字典、列表和数据帧以及它们如何相互关联)。

    Python Dataframe contains a list of dictionaries, need to create new dataframe with dictionary items Create pandas dataframe from nested dict with outer keys as df index and inner keys column headers Create Dataframe from a nested dictionary

【问题讨论】:

【参考方案1】:

假设所有子对象具有相同的结构,您可以从第一个开始列出键并将其用于列。

columns = ['TimeGenerated', *j['inputs'][0]['counters'].keys()]
df = pd.DataFrame([[t['TimeGenerated'], *t['counters'].values()] for t in j['inputs']], columns=columns)

输出

>>> df
    TimeGenerated  counter1  counter2  counter3
0  datetimestring   123.456   123.456   123.456
1  datetimestring   123.456   123.456   123.456
2  datetimestring   123.456   123.456   123.456

【讨论】:

有没有更简单的方法来获取列标题而不显式定义它们(我将有 91 列) 是的,但我需要知道作为列名的键将如何出现在 JSON 中。它们都是对象的键吗,比如TimeGenerated?或者某些键会在子对象中? 一列名称是TimeGenerated,这是对象中的键,其余所有(90)列是子对象的键(如counter1counter2等示例) 已编辑答案。再次检查,@Anirban。

以上是关于从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套列表创建字典 [重复]

提取嵌套字典和列表中的叶值集,不包括无

从列表字典更新我的数据框

来自数据框的嵌套字典,内部字典包含熊猫系列作为值

Python - 将字典列表附加到嵌套的默认字典时出现关键错误

具有数组和字典混合的横向展平雪管数据