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)) #使用 隐式函数,来传入参数
posted @ 2019-04-13 01:02  vlj  阅读(6093)  评论(0)    收藏  举报