Python教學欄位介紹如何巢狀JSON
推薦(免費):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 }
一個不太好的解決方案
一種選擇是直接擼碼,寫一個查找特定字段的函數,但問題是必須對每個嵌套字段呼叫此函數,然後再呼叫.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行就可搞定。步驟很簡單,懂了下面幾個用法即可。
確定我們要想的字段,使用 . 符號連接嵌套物件。
將想要處理的巢狀清單(這裡是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_normalize
的pandas
官方文件說明,如有不明白可自行學習,本次東哥就介紹到這裡。
pandas官方文件:https://pandas.pydata.org/pan...
以上是Python介紹巢狀 JSON 秒變 Dataframe!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

theDifferenceBetweewneaforoopandawhileLoopInpythonisthataThataThataThataThataThataThataNumberoFiterationSiskNownInAdvance,而leleawhileLoopisusedWhenaconDitionNeedneedneedneedNeedStobeCheckedStobeCheckedStobeCheckedStobeCheckedStobeceDrepeTysepectients.peatsiveSectlyStheStobeCeptellyWithnumberofiterations.1)forloopsareAceareIdealForitoringercortersence

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

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

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用