搜尋
首頁後端開發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之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

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

記事本++7.3.1

記事本++7.3.1

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