最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas合理展開嵌套JSON數(shù)據(jù)的全過程

 更新時間:2026年03月26日 09:26:15   作者:白酒永遠的神  
在數(shù)據(jù)分析實踐中,我們經(jīng)常需要處理來自 REST API、日志系統(tǒng)或 NoSQL 數(shù)據(jù)庫(如 MongoDB)的嵌套 JSON 數(shù)據(jù),這類數(shù)據(jù)結構靈活,但往往包含多層嵌套,本文將通過一個典型三層嵌套 JSON 示例,系統(tǒng)講解如何合理展開嵌套數(shù)據(jù),需要的朋友可以參考下

在數(shù)據(jù)分析實踐中,我們經(jīng)常需要處理來自 REST API、日志系統(tǒng)或 NoSQL 數(shù)據(jù)庫(如 MongoDB)的嵌套 JSON 數(shù)據(jù)。這類數(shù)據(jù)結構靈活,但往往包含多層嵌套,例如用戶信息中嵌套地址,同時關聯(lián)多個訂單記錄。直接將這樣的數(shù)據(jù)導入 pandas 通常會得到一列包含字典或列表的“半成品” DataFrame,無法直接用于分析。

雖然 pandas 提供了 pd.json_normalize() 等工具來展開嵌套結構,但在處理一對多關系(如一個用戶對應多個訂單)時,容易產(chǎn)生大量重復字段,導致內(nèi)存膨脹和計算效率下降。本文將通過一個典型三層嵌套 JSON 示例,系統(tǒng)講解如何合理展開嵌套數(shù)據(jù),并根據(jù)分析目標選擇最優(yōu)策略,避免不必要的冗余。

一、問題示例:三層嵌套 JSON

考慮如下數(shù)據(jù)結構:

data = [
    {
        "user_id": 1,
        "name": "Alice",
        "profile": {
            "age": 30,
            "address": {
                "city": "Beijing",
                "country": "China"
            }
        },
        "orders": [
            {"order_id": "O1", "amount": 100},
            {"order_id": "O2", "amount": 200}
        ]
    },
    {
        "user_id": 2,
        "name": "Bob",
        "profile": {
            "age": 25,
            "address": {
                "city": "Shanghai",
                "country": "China"
            }
        },
        "orders": [
            {"order_id": "O3", "amount": 150}
        ]
    }
]

目標是將每個訂單作為一行,同時附帶用戶的基本信息,形成如下表格:

user_idnameagecitycountryorder_idamount
1Alice30BeijingChinaO1100
1Alice30BeijingChinaO2200
2Bob25ShanghaiChinaO3150

乍看之下,這似乎是一個簡單的扁平化任務。但若某個用戶有成百上千個訂單,其基本信息將在每一行重復出現(xiàn),造成顯著的數(shù)據(jù)冗余。

二、基礎方法:使用json_normalize+explode

pandas 的 pd.json_normalize() 是處理嵌套 JSON 的核心工具。它能自動將 a.b.c 形式的路徑展開為列名:

import pandas as pd
df = pd.json_normalize(data)
# 列包括:user_id, name, profile.age, profile.address.city, ...

然而,orders 字段是一個字典列表,仍以列表形式存在。需進一步展開:

# 保留非 orders 字段
df_base = df.drop(columns=['orders'])

# 展開 orders
df_orders = df[['user_id', 'orders']].explode('orders').reset_index(drop=True)
df_orders_flat = pd.json_normalize(df_orders['orders'])

# 合并
result = pd.concat([
    df_base.loc[df_base.index.repeat(df['orders'].apply(len))].reset_index(drop=True),
    df_orders_flat
], axis=1)

此方法可得到所需寬表,但如前所述,用戶信息被重復復制。若訂單數(shù)量龐大,這種冗余將帶來以下問題:

  • 內(nèi)存占用急劇增加
  • 后續(xù)聚合或分組操作效率降低
  • 存儲成本上升(尤其在持久化為 CSV/Parquet 時)

因此,是否展開應取決于分析目標,而非技術便利性。

三、根據(jù)分析場景選擇策略

場景 1:以訂單為分析單元(如計算每單金額、地域分布)

此時需要將用戶屬性“附著”到訂單上,展開是合理的。但可通過以下方式優(yōu)化:

  • 使用 category 類型壓縮重復字符串
for col in ['name', 'city', 'country']:
    result[col] = result[col].astype('category')

這可將內(nèi)存占用降低 50% 以上,尤其適用于高基數(shù)分類變量。

  • 僅保留必要字段:避免將整個用戶對象展開,只提取分析所需的字段(如 city 而非完整 address)。

場景 2:以用戶為分析單元(如統(tǒng)計用戶總數(shù)、平均年齡)

此時不應展開訂單。更優(yōu)做法是構建兩個獨立表,模仿星型模型:

用戶表(users)

user_idnameagecitycountry

訂單表(orders)

user_idorder_idamount

實現(xiàn)方式:

# 用戶表
users = pd.json_normalize(data)[[
    'user_id', 'name', 'profile.age',
    'profile.address.city', 'profile.address.country'
]]
users.columns = ['user_id', 'name', 'age', 'city', 'country']

# 訂單表
orders_list = []
for user in data:
    for order in user['orders']:
        orders_list.append({
            'user_id': user['user_id'],
            'order_id': order['order_id'],
            'amount': order['amount']
        })
orders = pd.DataFrame(orders_list)

后續(xù)分析時按需關聯(lián):

# 例如:計算各城市訂單總額
merged = orders.merge(users[['user_id', 'city']], on='user_id')
summary = merged.groupby('city')['amount'].sum()

這種方式避免了冗余,且便于維護和擴展。

場景 3:數(shù)據(jù)規(guī)模極大(百萬級以上)

當數(shù)據(jù)量超出單機內(nèi)存限制時,建議:

  • 使用 PolarsDask:它們對嵌套結構支持更好,且支持惰性計算。
  • 采用 列式存儲格式(如 Parquet) 并按 user_id 分區(qū),減少 I/O 開銷。
  • 在 ETL 階段保留原始嵌套結構,在查詢時動態(tài)展開所需部分。

四、不要為了“整齊”而盲目展開

一個常見誤區(qū)是認為“所有數(shù)據(jù)都必須變成寬表才便于分析”。實際上,展開是一種分析前的數(shù)據(jù)準備手段,不是存儲規(guī)范

在實際項目中,推薦的做法是:

  1. ETL 階段:保留原始結構或拆分為規(guī)范化表;
  2. 分析階段:根據(jù)具體問題臨時展開或 join;
  3. 避免持久化高度冗余的寬表,除非有明確的 BI 報表需求。

此外,手寫循環(huán)解析雖直觀,但難以處理缺失字段、類型不一致等問題,且不可復用。相比之下,json_normalize + explode 的組合更具健壯性和擴展性。

五、總結

處理嵌套 JSON 時,pandas 提供了強大而靈活的工具鏈,但關鍵在于理解數(shù)據(jù)語義與分析目標之間的關系

  • 若分析單位是“子記錄”(如訂單、日志事件),可接受適度冗余,但應優(yōu)化存儲類型;
  • 若分析單位是“主實體”(如用戶、設備),應保持數(shù)據(jù)規(guī)范化,通過關聯(lián)獲取細節(jié);
  • 對于超大規(guī)模數(shù)據(jù),考慮更現(xiàn)代的分析引擎(如 Polars)或分布式方案。

最終,高效的數(shù)據(jù)處理不在于“能否展開”,而在于“何時展開、展開多少、如何管理冗余”。掌握這一思維,才能在復雜數(shù)據(jù)結構面前游刃有余。

以上就是Pandas合理展開嵌套JSON數(shù)據(jù)的全過程的詳細內(nèi)容,更多關于Pandas展開嵌套JSON數(shù)據(jù)的資料請關注腳本之家其它相關文章!

相關文章

  • Iconfont(矢量圖標)+iconmoon(圖標svg互轉)配合javascript實現(xiàn)社交分享系統(tǒng)

    Iconfont(矢量圖標)+iconmoon(圖標svg互轉)配合javascript實現(xiàn)社交分享系統(tǒng)

    這篇文章主要介紹了Iconfont(矢量圖標)+iconmoon(圖標svg互轉)配合javascript實現(xiàn)社交分享系統(tǒng),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Python實現(xiàn)獲取本機網(wǎng)卡的MAC地址,IP地址和路由表

    Python實現(xiàn)獲取本機網(wǎng)卡的MAC地址,IP地址和路由表

    本文主要為大家詳細介紹了如何在Windows和Mac系統(tǒng)下獲取本機MAC地址和IP地址的方法,以及如何使用ARP協(xié)議獲取局域網(wǎng)內(nèi)所有計算機的IP地址與MAC地址,感興趣的小伙伴可以了解下
    2026-05-05
  • Python繪制K線圖之可視化神器pyecharts的使用

    Python繪制K線圖之可視化神器pyecharts的使用

    這篇文章主要介紹了Python繪制K線圖之可視化神器pyecharts的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Python 中 Meta Classes詳解

    Python 中 Meta Classes詳解

    首先,在認識metaclass之前,你需要認識下python中的class。python中class的奇怪特性借鑒了smalltalk語言。大多數(shù)語言中,classes僅僅是用于描述怎樣創(chuàng)建一個對象的代碼端。在某種程度上說,python中的class也是這樣的。
    2016-02-02
  • Django中ORM的基本使用教程

    Django中ORM的基本使用教程

    這篇文章主要給大家介紹了關于Django中ORM基本使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 使用Python快速搭建文件傳輸服務的方法

    使用Python快速搭建文件傳輸服務的方法

    這篇文章主要介紹了使用Python快速搭建一個文件傳輸服務,這樣任何一個人都能打開瀏覽器把他電腦上的文件傳給我了,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Python 安裝 virturalenv 虛擬環(huán)境的教程詳解

    Python 安裝 virturalenv 虛擬環(huán)境的教程詳解

    這篇文章主要介紹了Python 安裝 virturalenv 虛擬環(huán)境的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Python正則表達式re模塊講解以及其案例舉例

    Python正則表達式re模塊講解以及其案例舉例

    Python中re模塊主要功能是通過正則表達式是用來匹配處理字符串的 ,下面這篇文章主要給大家介紹了關于Python正則表達式re模塊講解以及其案例舉例的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Python中set方法的使用教程詳解

    Python中set方法的使用教程詳解

    在Python中,set是一種集合數(shù)據(jù)類型,表示一個無序且不重復的集合。本文主要為大家詳細介紹了Python中set方法的使用,需要的可以參考一下
    2023-04-04
  • 關于Python如何避免循環(huán)導入問題詳解

    關于Python如何避免循環(huán)導入問題詳解

    在大型的Python工程中,由于架構設計不當,可能會出現(xiàn)模塊間相互引用的情況。下面這篇文章主要給大家介紹了關于如何避免Python的循環(huán)導入問題的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09

最新評論

贺州市| 龙岩市| 贡嘎县| 余姚市| 蓝田县| 浦江县| 柳江县| 墨江| 枣庄市| 巫溪县| 天全县| 镇巴县| 泸溪县| 信阳市| 凤庆县| 津市市| 萨迦县| 夏津县| 剑阁县| 昆明市| 米易县| 宁明县| 宾阳县| 太仓市| 崇信县| 宕昌县| 瑞丽市| 荣昌县| 饶河县| 中西区| 明光市| 迭部县| 五河县| 贡嘎县| 屏南县| 德钦县| 西丰县| 大邑县| 太保市| 抚顺县| 孝昌县|