【问题标题】:Extracting data from nested Python dictionaries从嵌套的 Python 字典中提取数据
【发布时间】:2021-08-24 22:19:09
【问题描述】:

我知道这里有一些类似的帖子,但是我尝试了每种解决方案,但没有一个适合我的场景。

我有一本复杂的字典,里面有很多列表和其他字典。看起来像这样:


data = {'key1': 'value1',
 'key2': 'value2',
 'key3': 'value3',
 'results': [{'id': 'id1_value',
   'label1': 'label1_value',
   'label2': 'label2_value',
   'fields': {'field1': 'field1_value',
    'field2': 'field2_value',
    'field3': 'field3_value'},
   'label3': 'label3_value',
   'label4': 'label4'},
 {'id': 'id2_value',
   'label1': 'label1_value',
   'label2': 'label2_value',
   'fields': {'field1': 'field1_value',
    'field2': 'field2_value',
    'field3': 'field3_value'},
   'label3': 'label3_value',
   'label4': 'label4'}]}

我想创建一个从该字典中提取某些值的数据框。具体来说,我想要以下内容:

id label2 field2 field3
id1 label2_value field2_value field3_value
id2 label2_value field2_value field3_value

我尝试创建一个空白列表,然后循环遍历数据结构,将我想要的各种元素保存到变量中,然后将它们附加到我的列表中。最后从列表中创建一个 df 。我使用了以下代码:

mylist = []

data_results = data['results']
for x in data_results:
    id = data_results['id']
    label2 = data_results['label2']
    fields = x['fields']
    for x in fields:
        field2 = fields['field2']
        field3 = fields['field3']
    mylist.append([label2,body,byline])
pd.DataFrame(mylist)

但是它不起作用,我得到了各种错误(例如“TypeError:列表索引必须是整数或切片,而不是 str”)或者我只得到一个元素而不是其他元素。

有什么建议吗?谢谢!

【问题讨论】:

  • data_results 是一个字典列表,所以data_results['id'] 会失败。您应该在 for 循环中使用 x 作为 id = x['id'] 等等。
  • 您的示例代码似乎没有定义“body”或“byline”,并且(正如@alexis 在下面指出的那样),重用像“x”这样的变量名称是一个麻烦的秘诀。 .. 而你的内部循环实际上并没有使用“x”,这似乎是一个错误。

标签: python json pandas loops dictionary


【解决方案1】:

如果您不再使用 x 这样的通用变量名称,您可能会发现更容易跟踪您正在查找的结构中的位置:

for result in data['results']:
    id_ = result['id']
    label2 = result['label2']
    fields = result['fields']  # Intermediate variable (note: no loop)
    field2 = fields['field2']
    field3 = fields['field3']
    mylist.append([id_, label2, field2, field3])

你明白了。 (同样在您的代码中,您将x 用于两种不同的目的,这肯定会带来惊喜。)

如果你的实际结构没有变得更深,你可能会发现写起来更简单

...
    field2 = result['fields']['field2']

显示该值的路径,而不是使用中间变量。但这只是个人喜好问题。

【讨论】:

  • 成功了!谢谢。想我是盯着这个太久了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 2018-04-20
  • 1970-01-01
  • 2021-10-29
  • 2023-03-20
  • 2016-05-15
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多