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