Pandas中Json數據處理


你的數據表中某一字段的數據格式是json類型(簡單理解就是字典和列表嵌套),你只需要用到json數據的某一項內容。

 

例如:

 

 

 

你只需要用到json數據里面的id信息,原地用id把原來的數據替換掉

tempsnip.png

 

解決方案

 

1.將str(字符串)轉成dict(字典)    #json.loads

2.對數據原地替換    #單列:pd.Seriers.apply      多列:pd.DataFrame.apply

 

 
100%

實例:

 

import pandas as pd import re import json def jsonLoads(strs,key): '''strs:傳進來的json數據  key:字典的鍵  ''' strs =re.sub("'",'"',strs) #單引號換成雙引號,下文解釋 dict_ = json.loads(strs) return list(i[key] for i in dict_) #原地代替原來的json數據,這里使用列表推導 if __name__ =='__main__': f= r'movies_metadata.csv' df =pd.read_csv(f) #DataFrame對象 col =df.genres #選取名為genres的一列數據,json數據,如上圖,此時是Series對象 print(col) col=col.apply(jsonLoads, key='id') #(函數,函數里的參數=) print(col)

處理前:

image.png

處理后:

image.png

 

因此:pd.Series.apply函數是依次對列中每個數據做處理

 

另外,pd.DataFrame.apply是對多列進行操作,沒有試過

 

討論

 

1.json.loads報錯

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes

原因:雙引號問題

strs1 ='[{"id": 16, "name": "Animation"}, {"id": 35, "name": "Comedy"}, {"id": 10751, "name": "Family"}]'

strs2 ="[{'id': 12, 'name': 'Adventure'}, {'id': 14, 'name': 'Fantasy'}, {'id': 10751, 'name': 'Family'}]"

 

會報錯的是strs2,因為字典的key(鍵)和value(值)都要用"(雙引號括起來)

解決:

 

import re strs =re.sub("'",'"',strs) #單引號換成雙引號,回應上文 #re.sub(被代替的,用來代替的,字符串) 一個代替函數

 

json.decoder.JSONDecodeError: Invalid \escape:

原因:出現了轉義字符 \

strs = '[{"iso_639_1": "ru", "name": "Pусский"}, {"iso_639_1": "lt", "name": "Lietuvi\x9akai"}]'

解決:

 

import re strs =re.sub(r'\\','',strs) #簡單粗暴,把轉義字符換成\\(斜桿) #另外r'strs',以r開頭的字符串指取消轉義

 

2.pd.Series.apply另外一個應用

將時間轉換成TimeStamp(時間戳,方便建模)

 

import pandas as pd if __name__ =='__main__': f= r'movies_metadata.csv' df =pd.read_csv(f) #DataFrame對象 df =df.drop(axis=1, index=[19730, 29503, 35587]) #去除異常值,不是重點 col =df.release_date #選取名為release_date的一列數據,此時是Series對象 print(col) col=col.apply(pd.Timestamp) #pd.TimeStame函數將時間轉成時間戳 print(col)

處理前:

image.png

處理后:

image.png

空值也能處理hhh。注意了

想讓某一個數據等於空,可以:=pd.Nat 或者 pd.np.nan

 

3.pd.Series.map  函數

 

當你想將字符型分類變量數值化

 

實例:

import pandas as pd if __name__ == '__main__': f = r'movies_metadata.csv' df = pd.read_csv(f) # DataFrame對象 df = df.drop(axis=1, index=[19730, 29503, 35587]) # 去除異常值,不是重點 col = df.video # 選取名為video的一列數據,此時是Series對象 print(col) col = col.map({True:1,False:0}) #用1代替True; 用0代替False print(col)

處理前:

image.png

處理后:

image.png

 

另外:該函數可以看成不帶參數的apply函數

轉換時間戳的函數可以改成

col=col.apply(pd.Timestamp) #pd.TimeStame函數將時間轉成時間戳 col=col.map(lambda x : pd.Timestamp(x)) #使用 隱式函數,來傳入參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM