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

Python介紹巢狀 JSON 秒變 Dataframe!

Dec 29, 2020 am 09:34 AM
dataframe json pandas python 資料處理

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

熱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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles