【问题标题】:Fetch value of a specific key from nested dictionary in pandas with python使用python从pandas中的嵌套字典中获取特定键的值
【发布时间】:2020-05-24 00:37:11
【问题描述】:

我正在遍历 pandas 数据框中的行,从特定列打印出嵌套字典。我的嵌套字典如下所示:

{'dek': "<p>Don't forget to buy a card</p>",
 'links': {'edit': {'dev': '//patty-menshealth.feature.net/en/content/edit/76517422-96ad-4b5c-a24a-c080c58bce0c',
   'prod': '//patty-menshealth.prod.com/en/content/edit/76517422-96ad-4b5c-a24a-c080c58bce0c',
   'stage': '//patty-menshealth.stage.net/en/content/edit/76517422-96ad-4b5c-a24a-c080c58bce0c'},
  'frontend': {'dev': '//menshealth.feature.net/trending-news/a19521193/fathers-day-weekend-plans/',
   'prod': '//www.menshealth.com/trending-news/a19521193/fathers-day-weekend-plans/',
   'stage': '//menshealth.stage.net/trending-news/a19521193/fathers-day-weekend-plans/'}},
 'header': {'title_color': 1, 'title_layout': 1},
 'sponsor': {'program_type': 1, 'tracking_urls': []},
 'social_dek': "<p>Don't forget to buy a card</p>",
 'auto_social': 0,
 'index_title': "\u200bWeekend Guide: Treat Your Dad Right This Father's Day",
 'short_title': "Treat Your Dad Right This Father's Day",
 'social_title': "\u200bWeekend Guide: Treat Your Dad Right This Father's Day",
 'editors_notes': '<p>nid: 2801076<br>created_date: 2017-06-16 13:00:01<br>compass_feed_date: 2017-06-21 14:01:58<br>contract_id: 40</p>',
 'seo_meta_title': "Treat Your Dad Right This Father's Day\u200b | Men’s Health",
 'social_share_url': '/trending-news/a19521193/fathers-day-weekend-plans/',
 'seo_related_links': {},
 'editor_attribution': 'by',
 'hide_from_homepage': 1,
 'syndication_rights': 3,
 'seo_meta_description': "\u200bFrom gifts to food ideas, we've got your Father's Day covered. Just don't forget to buy him a card."}

我使用下面的代码:

def recursive_items(dictionary):
    for key, value in dictionary.iteritems():
        if type(value) is dict:
            yield from recursive_items(value)
        else:
            yield (key, value)

for key, value in recursive_items(merged_df["metadata_y"]):
    print(key, value)    

如何获取特定键的值?我试图用print(key[5], value 包含我要获取的键的索引,它给了我一个错误:TypeError: 'int' object is not subscriptable。

如何获取价值?

【问题讨论】:

    标签: python pandas dictionary nested


    【解决方案1】:

    很抱歉没有直接解决原始问题,但也许值得使用 json_normalize 将嵌套列“展平”。

    例如,如果您的示例数据名为dictionary

    from pandas.io.json import json_normalize
    
    # Flatten the nested dict, resulting in a DataFrame with 1 row and 23 columns
    this_df = json_normalize(dictionary)
    
    # Inspect the resulting columns. Is this structure useful?
    this_df.columns
    Index(['dek', 'social_dek', 'auto_social', 'index_title', 'short_title',
           'social_title', 'editors_notes', 'seo_meta_title', 'social_share_url',
           'editor_attribution', 'hide_from_homepage', 'syndication_rights',
           'seo_meta_description', 'links.edit.dev', 'links.edit.prod',
           'links.edit.stage', 'links.frontend.dev', 'links.frontend.prod',
           'links.frontend.stage', 'header.title_color', 'header.title_layout',
           'sponsor.program_type', 'sponsor.tracking_urls'],
          dtype='object')
    

    【讨论】:

      【解决方案2】:
      data={'dek': "<p>Don't forget to buy a card</p>",
      'links': {'edit': {'dev': '//patty-menshealth.feature.net/en/content/edit/76517422-96ad-4b5c-a24a-c080c58bce0c',
      'prod': '//patty-menshealth.prod.com/en/content/edit/76517422-96ad-4b5c-a24a-c080c58bce0c',
      'stage': '//patty-menshealth.stage.net/en/content/edit/76517422-96ad-4b5c-a24a-c080c58bce0c'},
      'frontend': {'dev': '//menshealth.feature.net/trending-news/a19521193/fathers-day-weekend-plans/',
      'prod': '//www.menshealth.com/trending-news/a19521193/fathers-day-weekend-plans/',
      'stage': '//menshealth.stage.net/trending-news/a19521193/fathers-day-weekend-plans/'}},
      'header': {'title_color': 1, 'title_layout': 1},
      'sponsor': {'program_type': 1, 'tracking_urls': []},
      'social_dek': "<p>Don't forget to buy a card</p>",
      'auto_social': 0,
      'index_title': "\u200bWeekend Guide: Treat Your Dad Right This Father's Day",
      'short_title': "Treat Your Dad Right This Father's Day",
      'social_title': "\u200bWeekend Guide: Treat Your Dad Right This Father's Day",
      'editors_notes': '<p>nid: 2801076<br>created_date: 2017-06-16 13:00:01<br>compass_feed_date: 2017-06-21 14:01:58<br>contract_id: 40</p>',
      'seo_meta_title': "Treat Your Dad Right This Father's Day\u200b | Men’s Health",
      'social_share_url': '/trending-news/a19521193/fathers-day-weekend-plans/',
      'seo_related_links': {},
      'editor_attribution': 'by',
      'hide_from_homepage': 1,
      'syndication_rights': 3,
      'seo_meta_description': "\u200bFrom gifts to food ideas, we've got your Father's Day covered. Just don't forget to buy him a card."}
      
      def findValByKey(key:str, data:dict, level=0):
          for i in data.keys():
              print("{} {}".format(level*'-', i))
              if i==key:
                  print('---found---')
                  return data[key]
              elif isinstance(data[i], dict):
                  res = findValByKey(key, data[i], level+1)
                  if res:
                      return res
      
      
      print(findValByKey('title_color', data))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多