你的数据表中某一字段的数据格式是json类型(简单理解就是字典和列表嵌套),你只需要用到json数据的某一项内容。
例如:
你只需要用到json数据里面的id信息,原地用id把原来的数据替换掉
解决方案
1.将str(字符串)转成dict(字典) #json.loads
2.对数据原地替换 #单列:pd.Seriers.apply 多列:pd.DataFrame.apply
实例:
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)
处理前:
处理后:
因此: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)
处理前:
处理后:
空值也能处理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)
处理前:
处理后:
另外:该函数可以看成不带参数的apply函数
转换时间戳的函数可以改成
col=col.apply(pd.Timestamp) #pd.TimeStame函数将时间转成时间戳 col=col.map(lambda x : pd.Timestamp(x)) #使用 隐式函数,来传入参数