搜尋
首頁後端開發Python教學Python介紹巢狀 JSON 秒變 Dataframe!

Python介紹巢狀 JSON 秒變 Dataframe!

Dec 29, 2020 am 09:34 AM
dataframejsonpandaspython資料處理

Python教學欄位介紹如何巢狀JSON

Python介紹巢狀 JSON 秒變 Dataframe!

推薦(免費):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通常包含有關欄位的元資料。假設下面這些是我們想要的欄位。

  • key:JSON金鑰,在第一層的位置。
  • summary:第二層的「欄位」物件。
  • status name:第三級位置。
  • statusCategory name:位於第4個巢狀層級。

如上,我們選擇要提取的字段在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
}

一個不太好的解決方案

一種選擇是直接擼碼,寫一個查找特定字段的函數,但問題是必須對每個嵌套字段呼叫此函數,然後再呼叫.applyDataFrame中的新列。

為獲取我們想要的幾個字段,首先我們提取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行就可搞定。步驟很簡單,懂了下面幾個用法即可。

確定我們要想的字段,使用 . 符號連接嵌套物件。

將想要處理的巢狀清單(這裡是results["issues"])作為參數放進 .json_normalize 中。

過濾我們定義的FIELDS清單。

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_normalizepandas官方文件說明,如有不明白可自行學習,本次東哥就介紹到這裡。

pandas官方文件:https://pandas.pydata.org/pan...

以上是Python介紹巢狀 JSON 秒變 Dataframe!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
了解差異:用於循環和python中的循環了解差異:用於循環和python中的循環May 16, 2025 am 12:17 AM

theDifferenceBetweewneaforoopandawhileLoopInpythonisthataThataThataThataThataThataThataNumberoFiterationSiskNownInAdvance,而leleawhileLoopisusedWhenaconDitionNeedneedneedneedNeedStobeCheckedStobeCheckedStobeCheckedStobeCheckedStobeceDrepeTysepectients.peatsiveSectlyStheStobeCeptellyWithnumberofiterations.1)forloopsareAceareIdealForitoringercortersence

Python循環控制:對於vs -a -a比較Python循環控制:對於vs -a -a比較May 16, 2025 am 12:16 AM

在Python中,for循環適用於已知迭代次數的情況,而while循環適合未知迭代次數且需要更多控制的情況。 1)for循環適用於遍歷序列,如列表、字符串等,代碼簡潔且Pythonic。 2)while循環在需要根據條件控制循環或等待用戶輸入時更合適,但需注意避免無限循環。 3)性能上,for循環略快,但差異通常不大。選擇合適的循環類型可以提高代碼的效率和可讀性。

如何在Python中結合兩個列表:5種簡單的方法如何在Python中結合兩個列表:5種簡單的方法May 16, 2025 am 12:16 AM

在Python中,可以通過五種方法合併列表:1)使用 運算符,簡單直觀,適用於小列表;2)使用extend()方法,直接修改原列表,適用於需要頻繁更新的列表;3)使用列表解析式,簡潔且可對元素進行操作;4)使用itertools.chain()函數,內存高效,適合大數據集;5)使用*運算符和zip()函數,適用於需要配對元素的場景。每種方法都有其特定用途和優缺點,選擇時應考慮項目需求和性能。

循環時循環:python語法,用例和示例循環時循環:python語法,用例和示例May 16, 2025 am 12:14 AM

foroopsare whenthenemberofiterationsisknown,而whileLoopsareUseduntilacTitionismet.1)ForloopSareIdealForeSequencesLikeLists,UsingSyntaxLike'forfruitinFruitinFruitinFruitIts:print(fruit)'。 2)'

python串聯列表列表python串聯列表列表May 16, 2025 am 12:08 AM

toConcateNateAlistofListsInpython,useextend,listComprehensions,itertools.Chain,orrecursiveFunctions.1)ExtendMethodStraightForwardButverBose.2)listComprechencomprechensionsareconconconciseandemandeconeandefforlargerdatasets.3)

Python中的合併列表:選擇正確的方法Python中的合併列表:選擇正確的方法May 14, 2025 am 12:11 AM

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

如何在Python 3中加入兩個列表?如何在Python 3中加入兩個列表?May 14, 2025 am 12:09 AM

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

Python串聯列表字符串Python串聯列表字符串May 14, 2025 am 12:08 AM

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用