Выбор вложенных словарей и их преобразование в фрейм данных на Python

#python #dictionary #nested

Вопрос:

Выбор вложенных словарей и их преобразование в фрейм данных на Python

Из вложенных данных «библио» ниже, есть ли способ сортировки этого в фрейм данных с каждым ключом в виде столбца? Например, где «classifications_cpc» — это заголовок столбца с кодами в качестве последующих значений?

  {
  "publication_reference": {
    "jurisdiction": "US",
    "doc_number": "10236491",
    "kind": "B2",
    "date": "2019-03-19"
  },
  "application_reference": {
    "jurisdiction": "US",
    "doc_number": "201615053025",
    "kind": "A",
    "date": "2016-02-25"
  },
  "priority_claims": {
    "claims": [
      {
        "jurisdiction": "JP",
        "doc_number": "2015062114",
        "kind": "A",
        "date": "2015-03-25",
        "sequence": 1
      }
    ]
  },
  "invention_title": [
    {
      "text": "Lithium ion secondary battery",
      "lang": "en"
    }
  ],
  "parties": {
    "applicants": [
      {
        "residence": "JP",
        "extracted_name": {
          "value": "AUTOMOTIVE ENERGY SUPPLY CORP"
        }
      }
    ],
    "inventors": [
      {
        "residence": "JP",
        "sequence": 1,
        "extracted_name": {
          "value": "SAKAGUCHI SHINICHIRO"
        }
      },
      {
        "residence": "JP",
        "sequence": 2,
        "extracted_name": {
          "value": "KIMURA AIKA"
        }
      },
      {
        "residence": "JP",
        "sequence": 3,
        "extracted_name": {
          "value": "MIZUTA MASATOMO"
        }
      }
    ],
    "agents": [
      {
        "extracted_name": {
          "value": "Troutman Sanders LLP"
        }
      }
    ],
    "owners_all": [
      {
        "recorded_date": "2016-02-25",
        "execution_date": "2016-01-28",
        "extracted_name": {
          "value": "AUTOMOTIVE ENERGY SUPPLY CORPORATION"
        },
        "extracted_address": "10-1, HIRONODAI 2-CHOME, ZAMA-SHI, KANAGAWA, 252-0012",
        "extracted_country": "JP"
      }
    ]
  },
  "classifications_ipcr": {
    "classifications": [
      {
        "symbol": "H01M2/02"
      },
      {
        "symbol": "H01M2/14"
      },
      {
        "symbol": "H01M2/18"
      },
      {
        "symbol": "H01M10/0525"
      },
      {
        "symbol": "H01M10/0585"
      }
    ]
  },
  "classifications_cpc": {
    "classifications": [
      {
        "symbol": "H01M10/0525"
      },
      {
        "symbol": "H01M10/0525"
      },
      {
        "symbol": "H01M50/463"
      },
      {
        "symbol": "H01M10/0525"
      },
      {
        "symbol": "H01M10/0585"
      },
      {
        "symbol": "H01M10/0585"
      },
      {
        "symbol": "H01M50/10"
      },
      {
        "symbol": "H01M50/116"
      },
      {
        "symbol": "H01M50/116"
      },
      {
        "symbol": "H01M50/40"
      },
      {
        "symbol": "H01M50/40"
      },
      {
        "symbol": "H01M50/409"
      },
      {
        "symbol": "H01M50/543"
      },
      {
        "symbol": "H01M50/543"
      },
      {
        "symbol": "Y02E60/10"
      }
    ]
  },
  "references_cited": {
    "citations": [
      {
        "sequence": 1,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2011151307",
            "kind": "A1",
            "date": "2011-06-23"
          },
          "lens_id": "052-557-140-975-892"
        }
      },
      {
        "sequence": 2,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2011287301",
            "kind": "A1",
            "date": "2011-11-24"
          },
          "lens_id": "050-516-769-883-801"
        }
      },
      {
        "sequence": 3,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2014205887",
            "kind": "A1",
            "date": "2014-07-24"
          },
          "lens_id": "041-534-822-806-155"
        }
      },
      {
        "sequence": 4,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2015056492",
            "kind": "A1",
            "date": "2015-02-26"
          },
          "lens_id": "101-776-463-080-028"
        }
      },
      {
        "sequence": 5,
        "patcit": {
          "document_id": {
            "jurisdiction": "WO",
            "doc_number": "2013047778",
            "kind": "A1",
            "date": "2013-04-04"
          },
          "lens_id": "135-661-134-273-324"
        }
      },
      {
        "sequence": 1,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2011143183",
            "kind": "A1",
            "date": "2011-06-16"
          },
          "lens_id": "095-161-033-897-779"
        }
      },
      {
        "sequence": 2,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2014349169",
            "kind": "A1",
            "date": "2014-11-27"
          },
          "lens_id": "075-950-005-288-26X"
        }
      },
      {
        "sequence": 3,
        "patcit": {
          "document_id": {
            "jurisdiction": "US",
            "doc_number": "2015050542",
            "kind": "A1",
            "date": "2015-02-19"
          },
          "lens_id": "003-582-946-821-435"
        }
      },
      {
        "sequence": 4,
        "patcit": {
          "document_id": {
            "jurisdiction": "CN",
            "doc_number": "102124591",
            "kind": "A",
            "date": "2011-07-13"
          },
          "lens_id": "157-805-739-981-807"
        }
      },
      {
        "sequence": 5,
        "patcit": {
          "document_id": {
            "jurisdiction": "CN",
            "doc_number": "104106155",
            "kind": "A",
            "date": "2014-10-15"
          },
          "lens_id": "003-865-201-672-551"
        }
      },
      {
        "sequence": 6,
        "patcit": {
          "document_id": {
            "jurisdiction": "CN",
            "doc_number": "104205416",
            "kind": "A",
            "date": "2014-12-10"
          },
          "lens_id": "182-508-848-265-100"
        }
      },
      {
        "sequence": 7,
        "patcit": {
          "document_id": {
            "jurisdiction": "EP",
            "doc_number": "2747167",
            "kind": "A1",
            "date": "2014-06-25"
          },
          "lens_id": "167-072-626-506-628"
        }
      },
      {
        "sequence": 8,
        "patcit": {
          "document_id": {
            "jurisdiction": "JP",
            "doc_number": "2009277397",
            "kind": "A",
            "date": "2009-11-26"
          },
          "lens_id": "061-699-339-033-165"
        }
      },
      {
        "sequence": 9,
        "nplcit": {
          "text": "Extended European Search Report dated Apr. 14, 2016 issued in corresponding European Patent Application No. 16157356.3."
        }
      }
    ],
    "patent_count": 13,
    "npl_count": 1
  },
  "cited_by": {}
}
 

Есть какие-нибудь предложения или идеи?

Ответ №1:

Вам нужна колонка для каждого ключа? или только конкретные? Например, cited_by key value в нем ничего нет.

Однако назначьте предоставленные вами данные именам переменных your_data и попробуйте этот код:

 import pandas as pd
list_for_df =[]
classifications = your_data["classifications_cpc"]
symbol_list = classifications["classifications"]
for symbol in symbol_list:
    list_for_df.append(symbol["symbol"])
df = pd.DataFrame(list_for_df,columns=["classifications_cpc"])
 

Фрейм данных будет выглядеть так:

 classifications_cpc
0   H01M10/0525
1   H01M10/0525
2   H01M50/463
3   H01M10/0525
4   H01M10/0585
5   H01M10/0585
6   H01M50/10
7   H01M50/116
8   H01M50/116
9   H01M50/40
10  H01M50/40
11  H01M50/409
12  H01M50/543
13  H01M50/543
14  Y02E60/10
 

Комментарии:

1. Привет, Сэм! Спасибо за помощь. Это отлично работает. У меня есть еще один вопрос. Данные, которые я прикрепил, представляют собой всего одно значение/строку из 50 000 значений. Будет ли этот код уместен для использования при итерации по тысячам строк ?

2. Привет, Аюш, код будет работать для любого размера ваших данных, но не будет работать для любой структуры. Если ваши данные имеют ту же структуру, что и в показанном вами примере, так что не беспокойтесь, это сработает. Главный вопрос по-прежнему заключается в следующем: хотите ли вы иметь столбец для каждого ключа? или только конкретные? Если вы не понимаете структуру данных JSON, я бы рекомендовал вам внимательно прочитать это: realpython.com/python-json С наилучшими пожеланиями, Сэм

Ответ №2:

Позвольте мне попытаться подойти к вашим требованиям. Поскольку имена столбцов «classifications_cpc», «стороны» или «classifications_ipcr» представляют собой массив разной длины, не имеет смысла объединять их в один фрейм данных. В каждой результирующей строке будут сгруппированы несвязанные поля.

Возможно, вам нужно извлечь значения с помощью определенного ключа во вложенном словаре или «списках словарей». Например, использование рекурсивной функции для извлечения значений с помощью некоторого ключа:

 data = {...nested dictionary or 'lists of dictionaries'...}

def get_vals(nested, key):
    result = []
    if isinstance(nested, list) and nested != []:   #non-empty list
        for lis in nested:
            result.extend(get_vals(lis, key))
    elif isinstance(nested, dict) and nested != {}:   #non-empty dict
        for val in nested.values():
            if isinstance(val, (list, dict)):   #(list or dict) in dict
                result.extend(get_vals(val, key))
        if key in nested.keys():   #key found in dict
            result.append(nested[key])
    return result

get_vals(data, 'value')
 

Выход

 ['AUTOMOTIVE ENERGY SUPPLY CORP',
 'SAKAGUCHI SHINICHIRO',
 'KIMURA AIKA',
 'MIZUTA MASATOMO',
 'Troutman Sanders LLP',
 'AUTOMOTIVE ENERGY SUPPLY CORPORATION']
 

Или чтобы найти ключевые «классификации», вы получите 2 списка из «classifications_ipcr» и «classifications_cpc».:

 get_vals(data, 'classifications')

[[{'symbol': 'H01M2/02'},
  {'symbol': 'H01M2/14'},
  {'symbol': 'H01M2/18'},
  {'symbol': 'H01M10/0525'},
  {'symbol': 'H01M10/0585'}],
 [{'symbol': 'H01M10/0525'},
  {'symbol': 'H01M10/0525'},
  {'symbol': 'H01M50/463'},
  {'symbol': 'H01M10/0525'},
  {'symbol': 'H01M10/0585'},
  {'symbol': 'H01M10/0585'},
  {'symbol': 'H01M50/10'},
  {'symbol': 'H01M50/116'},
  {'symbol': 'H01M50/116'},
  {'symbol': 'H01M50/40'},
  {'symbol': 'H01M50/40'},
  {'symbol': 'H01M50/409'},
  {'symbol': 'H01M50/543'},
  {'symbol': 'H01M50/543'},
  {'symbol': 'Y02E60/10'}]]
 

Другой способ-использовать встроенную функцию pd.json_normalize() , но вы должны определить конкретную связь ключей, чтобы получить нужные вам данные.

 df = pd.json_normalize(data['classifications_cpc']['classifications'])
 

Выход df

     symbol
0   H01M10/0525
1   H01M10/0525
2   H01M50/463
3   H01M10/0525
4   H01M10/0585
5   H01M10/0585
6   H01M50/10
7   H01M50/116
8   H01M50/116
9   H01M50/40
10  H01M50/40
11  H01M50/409
12  H01M50/543
13  H01M50/543
14  Y02E60/10