學習python第15天

其實前面學的根本不記得了,小丑.jpg,如果真的面試問到了估計也是一臉懵

今日任務:

JSON


先認識一下JSON和JSONL文件

記得之前在面試KIMI的時候,面試官就給我出了JSONL和EXCEL轉換的手撕代碼題,而那個時候,我連什么是JSONL都不知道,然后毫無疑問的掛了。

JSON文件

  • 使用大括號 {} 表示對象,使用方括號 [] 表示數組,用來將所有的對象包裝在一起。

  • 整個文件是一個有效的 JSON 對象或數組。

  • 適合存儲結構化的數據,如配置文件、API 響應等。

  • 一次性讀取整個文件,解析成一個 JSON 對象,可以隨機訪問其中的數據。

{
"class": "Year 1",
"student" :[
{"name": "John", "age": 30},
{"name": "Jane", "age": 25},
{"name": "Bob", "age": 40}
]}

JSONL文件

  • 每行是一個獨立的有效 JSON 對象。

  • 每行之間沒有逗號或其他分隔符。

  • 適合存儲每行為獨立記錄的數據,如日志、傳感器數據、日志行等。

  • 逐行讀取文件,逐行解析 JSON 對象,一次處理一行的數據。

{"name": "John", "age": 30}
{"name": "Jane", "age": 25}
{"name": "Bob", "age": 40}

從JSON文件加載數據

read_json() 用于從 JSON 格式的數據中讀取并加載為一個 DataFrame。它支持從 JSON 文件、JSON 字符串或 JSON 網址中加載數據。

import pandas as pddf = pd.read_json(path_or_buffer,      # JSON 文件路徑、JSON 字符串或 URLorient=None,         # JSON 數據的結構方式,默認是 'columns',會根據文件自動判斷dtype=None,          # 強制指定列的數據類型convert_axes=True,   # 是否轉換行列索引convert_dates=True,  # 是否將日期解析為日期類型keep_default_na=True # 是否保留默認的缺失值標記
)

常見的 orient 參數選項:

orient 值JSON 格式示例描述
split{"index":["a","b"],"columns":["A","B"],"data":[[1,2],[3,4]]}使用鍵?indexcolumns?和?data?結構
records[{"A":1,"B":2},{"A":3,"B":4}]每個記錄是一個字典,表示一行數據
index{"a":{"A":1,"B":2},"b":{"A":3,"B":4}}使用索引為鍵,值為字典的方式
columns{"A":{"a":1,"b":3},"B":{"a":2,"b":4}}使用列名為鍵,值為字典的方式
values[[1,2],[3,4]]只返回數據,不包括索引和列名

從URL中讀取JSON數據

import pandas as pdURL = 'https://static.jyshare.com/download/sites.json'
df = pd.read_json(URL)
print(df)

JSON字符串

import pandas as pd# JSON 字符串
json_data = '''
[{"Name": "Alice", "Age": 25, "City": "New York"},{"Name": "Bob", "Age": 30, "City": "Los Angeles"},{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''# 從 JSON 字符串讀取數據
df = pd.read_json(json_data)print(df)#如果是下面這樣
json_data = [{"Name": "Alice", "Age": 25, "City": "New York"},{"Name": "Bob", "Age": 30, "City": "Los Angeles"},{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]#用df = pd.read_json(json_data)就會報錯
df = pd.DataFrame(json_data)

如果JSON內容很多,直接print(df)可能會打印不全,用print(df.to_srting())會打印完整數據


JSON數據內嵌

假設JSON數據中包含列表

# nested_list.json
{"school_name": "ABC primary school","class": "Year 1","students": [{"id": "A001","name": "Tom","math": 60,"physics": 66,"chemistry": 61},{"id": "A002","name": "James","math": 89,"physics": 76,"chemistry": 51},{"id": "A003","name": "Jenny","math": 79,"physics": 90,"chemistry": 78}]
}

如果直接read_json

import pandas as pddf = pd.read_json('nested_list.json')print(df)

結果是

          school_name   class                                           students
0  ABC primary school  Year 1  {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1  ABC primary school  Year 1  {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2  ABC primary school  Year 1  {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...

如果我們想把students的數據轉換成DataFrame,可以使用json_normalize()將折疊的JSON數據展平。record_path用于提取深層嵌套的列表,如果students列表嵌套在info這個字典中,則record_path可以寫成,下文的meta參數同理。

record_path=['info', 'students']  # 多層路徑用列表表示:先找 info,再找 students
import pandas as pd
import json# 使用 Python JSON 模塊載入數據
with open('nested_list.json','r') as f:data = json.loads(f.read())# 展平數據
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)

結果就是:

     id   name  math  physics  chemistry
0  A001    Tom    60       66         61
1  A002  James    89       76         51
2  A003  Jenny    79       90         78

如果要將school_name 和 class 也作為列,則使用'meta'參數

import pandas as pd
import json# 使用 Python JSON 模塊載入數據
with open('nested_list.json','r') as f:data = json.loads(f.read())# 展平數據
df_nested_list = pd.json_normalize(data, record_path =['students'], meta=['school_name', 'class']
)
print(df_nested_list)

可以看到school_name 和 class添加到了最后兩列,且三行數據是一樣的

     id   name  math  physics  chemistry         school_name   class
0  A001    Tom    60       66         61  ABC primary school  Year 1
1  A002  James    89       76         51  ABC primary school  Year 1
2  A003  Jenny    79       90         78  ABC primary school  Year 1

如果JSON文件中既包含列表,又包含字典,如

{"school_name": "local primary school","class": "Year 1","info": {"president": "John Kasich","address": "ABC road, London, UK","contacts": {"email": "admin@e.com","tel": "123456789"}},"students": [{"id": "A001","name": "Tom","math": 60,"physics": 66,"chemistry": 61},{"id": "A002","name": "James","math": 89,"physics": 76,"chemistry": 51},{"id": "A003","name": "Jenny","math": 79,"physics": 90,"chemistry": 78}]
}

現在將students和info.president和info.contats.tel構成dataframe

import pandas as pd
import json# 使用 Python JSON 模塊載入數據
with open('nested_mix.json','r') as f:data = json.loads(f.read())df = pd.json_normalize(data, record_path =['students'], meta=['class',['info', 'president'], #表示先找info,再找president['info', 'contacts', 'tel']#表示先找info,再找contacts,再找tel]
)print(df)

輸出就是

     id   name  math  physics  chemistry   class info.president info.contacts.tel
0  A001    Tom    60       66         61  Year 1    John Kasich         123456789
1  A002  James    89       76         51  Year 1    John Kasich         123456789
2  A003  Jenny    79       90         78  Year 1    John Kasich         123456789

其他更復雜嵌套,用到glom模塊,建議直接問AI吧

不用?record_path的一個小實驗

nested_list.json
{"class": "一班","students": [{"name": "張三", "age": 18},{"name": "李四", "age": 19}]
}test.py
import pandas as pd
import json# 先使用json模塊讀取文件
with open('nested_list.json', 'r') as f:data = json.load(f)
df = pd.json_normalize(data)
print(df['students'])

會輸出

0    [{'name': '張三', 'age': 18}, {'name': '李四', 'age': 19}]
Name: students, dtype: object

因為JSON結構是頂層字典包含students鍵,所以會直接將頂層鍵students解析為一列,而students鍵是一個列表,所以students對應的值就是整個列表

  • df['class']?對應的值是字符串?"一班"

  • df['students']?對應的值是整個學生列表(未被進一步展開,因為它本身就是頂層鍵)

如果不用json.load,直接pd.read_json('nested_list.json'),則會報錯,因為'nested_list.json'里含有復雜嵌套,無法解析為dataframe


輸出為JSON文件

DataFrame.to_json() - 將 DataFrame 轉換為 JSON 數據,并指定JSON的結構化方式

df.to_json(path_or_buffer=None,    # 輸出的文件路徑或文件對象,如果是 None 則返回 JSON 字符串orient=None,            # JSON 格式方式,支持 'split', 'records', 'index', 'columns', 'values'date_format=None,       # 日期格式,支持 'epoch', 'iso'default_handler=None,   # 自定義非標準類型的處理函數lines=False,            # 是否將每行數據作為一行(適用于 'records' 或 'split')encoding='utf-8'        # 編碼格式
)

默認用columns格式轉換JSON

import pandas as pd# 創建 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['New York', 'Los Angeles', 'Chicago']
})#路徑為空,則不會生成JSON文件,返回 JSON 字符串
json_str = df.to_json()print(json_str)'''
{"Name":{"0":"Alice","1":"Bob","2":"Charlie"},"Age":{"0":25,"1":30,"2":35},"City":{"0":"New York","1":"Los Angeles","2":"Chicago"}}
'''

用records模式審

import pandas as pd# 創建 DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['New York', 'Los Angeles', 'Chicago']
})# 將 DataFrame 轉換為 JSON 文件,指定 orient='records'
#路徑不為空
df.to_json('data.json', orient='records', lines=True)'''
{"Name":"Alice","Age":25,"City":"New York"},
{"Name":"Bob","Age":30,"City":"Los Angeles"},  
{"Name":"Charlie","Age":35,"City":"Chicago"}
'''

JSON稍微有點復雜,主要是嵌套

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95094.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring框架集成Kakfa的方式

Spring框架集成Kakfa的方式 springboot集成kafka的方式 添加maven依賴 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version> </dependency&g…

【藍橋杯 2024 省 Python B】繳納過路費

【藍橋杯 2024 省 Python B】繳納過路費 藍橋杯專欄&#xff1a;2024 省 Python B 算法競賽&#xff1a;圖論&#xff0c;生成樹&#xff0c;并查集&#xff0c;組合計數&#xff0c;kruskal 最小生成樹&#xff0c;乘法原理 題目鏈接&#xff1a;洛谷 【藍橋杯 2024 省 Python…

個性化導航新體驗:cpolar讓Dashy支持語音控制

文章目錄簡介1. 安裝Dashy2. 安裝cpolar3.配置公網訪問地址4. 固定域名訪問用 cpolar 讓 Dashy 管理個人導航站就是這么簡單&#xff01;三步輕松搞定&#xff1a;在電腦上安裝 Dashy&#xff0c;拖拽添加常用網站&#xff0c;運行 cpolar 生成遠程訪問鏈接。這個方法不僅免費&…

SQL學習記錄

基本的&#xff0c;增、刪&#xff0c;改insert into table_name (列1, 列2,...) VALUES (值1, 值2,....)Delete from 表 where keyvalueupdate 表 set keyvalue,keyvalue where keyvalue查用的最多whereSELECT prod_name, prod_price FROM Products WHERE vend idDLLO1OR ve…

零基礎學C++,函數篇~

C基礎學習&#xff08;DAY_06&#xff09;函數1. 函數的定義與使用2. 函數參數傳遞3. 變量的聲明周期4. 函數的其他特性5. 函數的嵌套與遞歸函數 1. 函數的定義與使用 ? 在設計程序時&#xff0c;如果一段代碼重復進行某種操作或者完成一個特定的功能&#xff0c;就應該將這…

react+vite+ts 組件模板

1.創建項目npm create vitelatest my-app --template react-ts2.配置項目 tsconfig.json{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020", "DOM", "D…

C語言 - 輸出參數詳解:從簡單示例到 alloc_chrdev_region

C語言中的輸出參數詳解&#xff1a;以 alloc_chrdev_region 為例 在學習 C 語言函數調用時&#xff0c;我們常常接觸到“輸入參數”&#xff0c;比如把一個數字傳給函數&#xff0c;讓函數幫我們算出結果。但有時候可能會發現&#xff0c;有些函數除了返回值之外&#xff0c;還…

機器視覺學習-day09-圖像矯正

1 仿射變換與透視變換1.1 仿射變換之前在圖像旋轉實驗中已經接觸過仿射變換&#xff0c;仿射變換是一個二維坐標系到另一個二維坐標系的過程&#xff0c;在仿射變換中符合直線的平直性和平行性。1.2 透視變換透視變換是把一個圖像投影到一個新的視平面的過程。在現實世界中&…

杰理ac791獲取之前版本sdk

很慚愧&#xff0c;一個如此簡單的問題卡了這么久&#xff0c;運動戰的本質就是多找線索&#xff0c;多嘗試

基于軸重轉移補償和多軸協調的粘著控制方法研究

基于軸重轉移補償和多軸協調的粘著控制方法研究 1. 論文標題 基于軸重轉移補償和多軸協調的粘著控制方法研究 2. 內容概括 該論文針對重載電力機車在復雜軌面條件下易發生空轉的問題,提出了一種新型粘著控制方法。傳統方法僅考慮單軸粘著利用而忽略軸間關系,本文設計了包…

臺達 PLC 軟件導入 EDS 文件后不能通過 PDO 控制的解決方法

一、功能及注意事項 1.功能說明&#xff1a;通過修改 EDS 文件處理臺達 PLC 軟件導入 EDS 文件后不能通過 PDO 控制的解決方法 2.注意事項&#xff1a;1).此文檔只針對立邁勝 CANopen 通訊一體化電機&#xff1b; 2).EDS 文件可以用記事本打開&#xff1b; 二、EDS 文件修改 IS…

Python庫2——Matplotlib2

上一篇文章主要介紹了Matplotlib庫中的Pyplot模塊中幾大常見圖像的繪制&#xff0c;包括自行修改圖像的屬性&#xff0c;在繪制圖像時會自動創建一個圖形窗口來展現這些圖像。本節內容繼續講講這個&#xff08;Figure&#xff09;圖像窗口即其一些常見用法。 其他python庫鏈接…

AI生成思維導圖和AI生成Excel公式

AI生成思維導圖和AI生成Excel公式 AI 生成思維導圖和 AI 生成 Excel 公式是一個完全免費的 AI 辦公合集網站。 它完全免費&#xff0c;一個網站支持多個實用 AI 辦公功能&#xff0c;包括&#xff1a;免費 AI Excel 公式生成器、輸入 Excel 公式解釋含義、AI Excel 助手、Exc…

java中的VO、DAO、BO、PO、DO、DTO

VO、DAO、BO 等對象在了解這里 po、vo、dao、之前先介紹下 MVC 開發模式M層負責與數據庫打交道&#xff1b;C層負責業務邏輯的編寫&#xff1b;V層負責給用戶展示&#xff08;針對于前后端不分離的項目&#xff0c;不分離項目那種編寫模版的方式&#xff0c;理解V的概念更直觀&…

More Effective C++ 條款16:牢記80-20準則(Remember the 80-20 Rule)

More Effective C 條款16&#xff1a;牢記80-20準則&#xff08;Remember the 80-20 Rule&#xff09;核心思想&#xff1a;軟件性能優化遵循帕累托原則&#xff08;Pareto Principle&#xff09;&#xff0c;即大約80%的性能提升來自于優化20%的關鍵代碼。識別并專注于這些關鍵…

Java中對泛型的理解

一、泛型是什么&#xff1f;1. 定義&#xff1a; 泛型允許你在定義類、接口或方法時使用類型參數&#xff08;Type Parameter&#xff09;。在使用時&#xff08;如聲明變量、創建實例時&#xff09;&#xff0c;再用具體的類型實參&#xff08;Type Argument&#xff09; 替換…

Redis開發06:使用stackexchange.redis庫結合WebAPI對redis進行增刪改查

一、接口寫法namespace WebApplication1.Controllers.Redis {[ApiController][Route("/api/[controller]")]public class RedisService : IRedisService{private readonly IConnectionMultiplexer _redis;//StackExchange.Redis庫自帶接口public RedisService(IConne…

【前端教程】從零開始學JavaScript交互:7個經典事件處理案例解析

在網頁開發中&#xff0c;交互性是提升用戶體驗的關鍵。JavaScript作為網頁交互的核心語言&#xff0c;通過事件處理機制讓靜態頁面"動"了起來。本文將通過7個經典案例&#xff0c;從簡單到復雜&#xff0c;逐步講解JavaScript事件處理的實現方法和應用場景。 案例1&…

內存模型(Memory Model)是什么?

內存模型(Memory Model)是什么? 內存模型是一個非常深刻且核心的計算機科學概念。 核心摘要 內存模型是一個契約或協議,它精確定義了: 一個線程對共享內存的寫操作,如何以及何時對其他線程可見。 內存操作(讀/寫)可以被重新排序的程度。 它連接了硬件(CPU如何執行指令…

在 MyBatis 中oracle基本數值類型的 JDBC 類型映射

基本數值類型的 JDBC 類型Java 類型JDBC 類型 (jdbcType)說明int / IntegerINTEGER標準整數類型long / LongBIGINT大整數類型short / ShortSMALLINT小整數類型float / FloatFLOAT單精度浮點數double / DoubleDOUBLE雙精度浮點數java.math.BigDecimalDECIMAL高精度小數&#xff…