【Python基礎】嵌套 JSON 秒變 Dataframe!

2021-12-23 機器學習初學者

來源:Python數據科學

作者:東哥起飛

調用API和文檔資料庫會返回嵌套的JSON對象,當我們使用Python嘗試將嵌套結構中的鍵轉換為列時,數據加載到pandas中往往會得到如下結果:

df = pd.DataFrame.from_records(results [「 issues」],columns = [「 key」,「 fields」])

說明:這裡results是一個大的字典,issues是results其中的一個鍵,issues的值為一個嵌套JSON對象字典的列表,後面會看到JSON嵌套結構。

問題在於API返回了嵌套的JSON結構,而我們關心的鍵在對象中確處於不同級別。

嵌套的JSON結構張成這樣的。

而我們想要的是下面這樣的。

下面以一個API返回的數據為例,API通常包含有關欄位的元數據。假設下面這些是我們想要的欄位。

如上,我們選擇要提取的欄位在issues列表內的JSON結構中分別處於4個不同的嵌套級別,一環扣一環。

{
  "expand": "schema,names",
  "issues": [
    {
      "fields": {
        "issuetype": {
          "avatarId": 10300,
          "description": "",
          "id": "10005",
          "name": "New Feature",
          "subtask": False
        },
        "status": {
          "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.",
          "id": "5",
          "name": "Resolved",
          "statusCategory": {
            "colorName": "green",
            "id": 3,
            "key": "done",
            "name": "Done",
          }
        },
        "summary": "Recovered data collection Defraglar $MFT problem"
      },
      "id": "11861",
      "key": "CAE-160",
    },
    {
      "fields": { 
... more issues],
  "maxResults": 5,
  "startAt": 0,
  "total": 160
}


一個不太好的解決方案

一種選擇是直接擼碼,寫一個查找特定欄位的函數,但問題是必須對每個嵌套欄位調用此函數,然後再調用.apply到DataFrame中的新列。

為獲取我們想要的幾個欄位,首先我們提取fields鍵內的對象至列:

df = (
    df["fields"]
    .apply(pd.Series)
    .merge(df, left_index=True, right_index = True)
)

從上表看出,只有summary是可用的,issuetype、status等仍然埋在嵌套對象中。

下面是提取issuetype中的name的一種方法。

# 提取issue type的name到一個新列叫"issue_type"
df_issue_type = (
    df["issuetype"]
    .apply(pd.Series)
    .rename(columns={"name": "issue_type_name"})["issue_type_name"]
)
df = df.assign(issue_type_name = df_issue_type)

像上面這樣,如果嵌套層級特別多,就需要自己手擼一個遞歸來實現了,因為每層嵌套都需要調用一個像上面解析並添加到新列的方法。

對於編程基礎薄弱的朋友,手擼一個其實還挺麻煩的,尤其是對於數據分析師,著急想用數據的時候,希望可以快速拿到結構化的數據進行分析。

下面東哥分享一個pandas的內置解決方案。

內置的解決方案

pandas中有一個牛逼的內置功能叫 .json_normalize。

pandas的文檔中提到:將半結構化JSON數據規範化為平面表。

前面方案的所有代碼,用這個內置功能僅需要3行就可搞定。步驟很簡單,懂了下面幾個用法即可。

FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"]
df = pd.json_normalize(results["issues"])
df[FIELDS]

沒錯,就這麼簡單。其它操作記錄路徑

除了像上面那樣傳遞results["issues"]列表之外,我們還使用record_path參數在JSON對象中指定列表的路徑。

# 使用路徑而不是直接用results["issues"]
pd.json_normalize(results, record_path="issues")[FIELDS]

自定義分隔符

還可以使用sep參數自定義嵌套結構連接的分隔符,比如下面將默認的「.」替換「-」。

# 用 "-" 替換默認的 "."
FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"]
pd.json_normalize(results["issues"], sep = "-")[FIELDS]

控制遞歸

如果不想遞歸到每個子對象,可以使用max_level參數控制深度。在這種情況下,由於statusCategory.name欄位位於JSON對象的第4級,因此不會包含在結果DataFrame中。

# 只深入到嵌套第二級
pd.json_normalize(results, record_path="issues", max_level = 2)

下面是.json_normalize的pandas官方文檔說明,如有不明白可自行學習,本次東哥就介紹到這裡。

pandas官方文檔:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.json_normalize.html

原創不易,來個三連支持下。

獲取本站知識星球優惠券,複製連結直接打開:

https://t.zsxq.com/y7uvZF6

本站qq群704220115。

加入微信群請掃碼:

相關焦點

  • 嵌套 JSON 秒變 Dataframe!
    fields」])說明:這裡results是一個大的字典,issues是results其中的一個鍵,issues的值為一個嵌套JSON對象字典的列表,後面會看到JSON嵌套結構。statusCategory": {            "colorName": "green",            "id": 3,            "key": "done",            "name": "Done",          }        },        "summary": "Recovered da
  • python標準庫json學習筆記
    什麼是jsonjavascript object notation,javascript對象表示法,是輕量級的文本數據交換格式,獨立於語言,具有自我描述性,更易理解,小、快、易解析。(type(person))print(person)json_str = json.dumps(person) print(type(json_str))print(json_str)json_str = json.dumps(person,indent=4)輸出效果更好了:
  • pandas100個騷操作:JSON自動解析為DataFrame
    [「 issues」],columns = [「 key」,「 fields」])說明:這裡results是一個大的字典,issues是results其中的一個鍵,issues的值為一個嵌套JSON對象字典的列表,後面會看到JSON嵌套結構。
  • Python基礎|常用的Series 和 Dataframe處理方法
    照例,本文會以方法基礎格式+代碼樣例的形式加以講解說明。知識不在於「大」,在於「用」。一、基礎方法介紹Series 和 Dataframeimport numpy as npimport pandas as pd#from pandas import Sereis, DataFramedf = pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns
  • python解析json方法
    最近在學ES,往裡面灌數據,ES默認格式是json,因此需要用到python去處理json格式。
  • Python處理JSON數據,建議收藏!
    、輕量級的資料交換語言,該語言以易於讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的數據對象。詳細的學習資料見官網:https://docs.python.org/3/library/json.html首先使用的時候直接導入該包:import jsonjson包中存在4中方法用來進行和Python內置數據類型的轉化:方法作用json.dumps()將python對象編碼成Json字符串:字典到jsonjson.loads()將
  • Python入門Python處理CSV、JSON和XML數據的簡便方法
    import pandas as pdfrom dicttoxml import dicttoxmlimport json# Building our dataframedata = {'Name': ['Emily', 'Katie', 'John', 'Mike'],'Goals': [12, 8, 16, 3],'Assists
  • Python 讀取 JSON 數據的騷操作
    JSON 編碼的字符串轉換回一個 Python 數據結構:data = json.loads(json_str)如果你要處理的是文件而不是字符串,你可以使用 json.dump() 和 json.load()來編碼和解碼 JSON 數據。
  • Python入門教程Python處理CSV、JSON和XML數據的簡便方法
    import pandas as pdfrom dicttoxml import dicttoxmlimport json# Building our dataframedata = {'Name': ['Emily', 'Katie', 'John', 'Mike'],'Goals': [12, 8, 16, 3],'Assists
  • Pandas-DataFrame基礎知識點總結
    根據字典創建data = {    'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],    'year':[2000,2001,2002,2001,2002],    'pop':[1.5,1.7,3.6,2.4,2.9]}frame = pd.DataFrame(data)frame#輸出    pop state
  • 不服不行,Python 操作 JSON 的門道也這麼多~
    、輕量級的資料交換語言,該語言以易於讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的數據對象。詳細的學習資料見官網:https://docs.python.org/3/library/json.html首先使用的時候直接導入該包:import jsonjson包中存在4中方法用來進行和Python內置數據類型的轉化:方法作用json.dumps()將python對象編碼成Json字符串:字典到jsonjson.loads()將
  • Python 標準庫之 JSON
    JSON 構建於兩種結構基礎之上:Python 標準庫中有 JSON 模塊,主要是執行序列化和反序列化功能。基本操作JSON 模塊相比於 XML 來說真的是簡單多了:>>> import json>>> json.
  • 呆瓜半小時入門python數據分析_v2
    下載安裝課時8python第三方包安裝(pip和conda install)課時9python非官方包下載地址課時10為什麼使用jupyter notebook及如何安裝課時11jupyter基本文本編輯操作課時12jupyter notebook打開指定文件夾內容章節3python編程基礎課時13python官網課時14Python文件基本操作
  • 10 種創建 DataFrame 的方式,你知道幾個?
    3、讀取 json 文件比如本地當前目錄下有一份 json 格式的數據:通過 pandas 讀取進來:df4 = pd.read_json("information.json")df4 = []for i in cur.fetchall():    data.append(i)   # 將每條結果追加到列表中data
  • Python3 JSON 數據解析 | Python JSON Parsing
    /usr/bin/python3 import json # Python 字典類型轉換為 JSON 對象 data = { 'no' : 1, 'name' : 'Runoon', 'url' : 'http://www.runoon.com' } json_str = json.dumps(data)
  • 如何使用Python 和 Pandas讀寫JSON文件
    在第一部分中,我們將使用Python包json來創建一個JSON文件並寫入一個JSON文件。在下一部分中,我們將使用Pandas的 json方法將JSON文件加載到Pandas 數據幀中。在這裡,我們將學習如何從本地和一個URL讀取JSON文件,以及如何使用Pandas讀取一個嵌套的JSON文件。
  • python數據分析專題 (12):DataFrame
    DataFrame既有行索引也有列索引,pandas中的DataFrame類似於R中的data.frame數據框,屬於二維數據。是數據分析中最為常用的數據類型。創建DataFrame可以使用pandas包中的DataFrame()函數生成DataFrame數據結構。有多種方式,可以直接從python的字典進行轉換,也可以從ndarry生成。
  • python對json的操作總結
    最簡單的例子如下所示:>>> import json>>> data = {"spam" : "foo", "parrot" : 42}>>> in_json = json.dumps(data) # Encode the data>>> in_json'{"parrot": 42
  • Python基礎 | pandas.dataframe 專題使用指南
    8.如何返回一個dataframe的單列或單行如上,此時返回的是一個series,而不是dataframe。若要返回dataframe,可用中括號把索引括上,如下。dataframe,看下例子也就明白了。
  • 在python中處理JSON數據
    () 將 python 對象轉換為 JSON 字符串import jsondata = {    "myName": "Yves",    "myLastName": "Boutellier",    "hobbies": ["sports", "blogging", "programming"],