从嵌套字典结构列表(具有两个级别)创建数据框的 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)列是子对象的键(如counter1
、counter2
等示例)
已编辑答案。再次检查,@Anirban。以上是关于从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章