【问题标题】:Selecting nested dictionaries and turning them to a DataFrame in Python选择嵌套字典并将它们转换为 Python 中的 DataFrame
【发布时间】:2021-08-14 15:25:42
【问题描述】:

选择嵌套字典并将它们转换为 Python 中的 DataFrame

从下面嵌套的“biblio”数据中,有没有办法将其排序到一个数据框中,每个键作为一列?例如,“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": {}
}

有什么建议或想法吗?

【问题讨论】:

    标签: python dictionary nested


    【解决方案1】:

    您希望每个键都有一个列吗?还是只有特定的?例如,cited_bykey 中没有 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
    

    【讨论】:

    • 嗨,山姆!谢谢您的帮助。这很好用。我有另一个问题。我附加的数据只是 50,000 个值的一个值/行。迭代数千行时是否适合使用此代码?
    • 嗨,Ayush,该代码适用于您的数据大小,但不适用于任何结构。如果您的数据与您展示的示例具有相同的结构,那么不用担心,它会起作用。主要问题仍然是:您是否希望每个键都有一列?还是只有特定的?如果您不了解 JSON 的数据结构,我建议您仔细阅读:realpython.com/python-jsonBest 问候,Sam
    【解决方案2】:

    让我尝试满足您的要求。由于列名 'classifications_cpc' 或 'parties' 或 'classifications_ipcr' 都是长度不等的数组,因此将它们放在一个单独的 DataFrame 中是没有意义的。每个结果行都会将不相关的字段组合在一起。

    您可能正在寻找使用嵌套字典或“字典列表”中的特定键提取值。例如使用递归函数通过某个键提取值:

    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']
    

    或者要查找关键的“分类”,您会从“分类_ipcr”和“分类_cpc”中获得 2 个列表:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-16
      • 2019-04-08
      • 2023-02-10
      • 2019-03-03
      • 2018-07-13
      • 2021-06-11
      • 2019-12-09
      相关资源
      最近更新 更多