半结构化数据处理,有兴趣了解一下?
上回书说道我们对于常见的结构化数据采用pandas模块可以对其进行处理,那今天我们再来谈谈对于半结构化的数据,对于它,我们应该怎么办?
首先我们需要了解一下,什么是半结构化的数据?
和普通纯文本相比,半结构化数据具有一定的结构性,但和具有严格理论模型的关系数据库的数据相比。OEM(Objectexchange Model)是一种典型的半结构化数据模型。
半结构化数据(semi-structured data)。在做一个信息系统设计时肯定会涉及到数据的存储,一般我们都会将系统信息保存在某个指定的关系数据库中。我们会将数据按业务分类,并设计相应的表,然后将对应的信息保存到相应的表中。比如我们做一个业务系统,要保存员工基本信息:工号、姓名、性别、出生日期等等;我们就会建立一个对应的staff表。
但不是系统中所有信息都可以这样简单的用一个表中的字段就能对应的。
它和结构化的数据相比,结构变化很大。因为我们要了解数据的细节所以不能将数据简单的组织成一个文件按照非结构化数据处理,由于结构变化很大也不能够简单的建立一个表和他对应。
先举一个半结构化的数据的例子,比如存储员工的简历。不像员工基本信息那样一致每个员工的简历大不相同。有的员工的简历很简单,比如只包括教育情况;有的员工的简历却很复杂,比如包括工作情况、婚姻情况、出入境情况、户口迁移情况、党籍情况、技术技能等等。还有可能有一些我们没有预料的信息。通常我们要完整的保存这些信息并不是很容易的,因为我们不会希望系统中的表的结构在系统的运行期间进行变更。
首先我们从数据表中取出这样的一串字符串:
num":"170****3656",
"net_flow":"0.0",
"total_amount":"310.0",
"call_out_time":"40.96666666666667",
"cell_mth":"2017-05",
"cell_loc":"宁夏",
"call_cnt":"105",
"cell_operator_zh":"中国联通",
"call_out_cnt":"44",
"cell_operator":"chinaunicom",
"call_in_time":"199.75",
"call_in_cnt":"61"
}, {
"sms_cnt":"5",
"cell_phone_num":"170****3656",
"net_flow":"0.0",
"total_amount":"216.1",
"call_out_time":"69.9",
"cell_mth":"2017-04",
"cell_loc":"宁夏",
"call_cnt":"125",
"cell_operato[{
"phone_num":"170****3656",
"behavior":[{
"sms_cnt":"1",
"cell_phone_num":"170****3656",
"net_flow":"0.0",
"total_amount":"-1.0",
"call_out_time":"0.0",
"cell_mth":"2017-08",
"cell_loc":"宁夏",
"call_cnt":"29",
"cell_operator_zh":"中国联通",
"call_out_cnt":"0",
"cell_operator":"chinaunicom",
"call_in_time":"28.366666666666667",
"call_in_cnt":"29"
}, {
"sms_cnt":"13",
"cell_phone_num":"170****3656",
"net_flow":"0.0",
"total_amount":"228.28",
"call_out_time":"13.55",
"cell_mth":"2017-07",
"cell_loc":"宁夏",
"call_cnt":"74",
"cell_operator_zh":"中国联通",
"call_out_cnt":"17",
"cell_operator":"chinaunicom",
"call_in_time":"46.05",
"call_in_cnt":"57"
}, {
"sms_cnt":"8",
"cell_phone_num":"170****3656",
"net_flow":"0.0",
"total_amount":"240.0",
"call_out_time":"22.4",
"cell_mth":"2017-06",
"cell_loc":"宁夏",
"call_cnt":"107",
"cell_operator_zh":"中国联通",
"call_out_cnt":"40",
"cell_operator":"chinaunicom",
"call_in_time":"48.516666666666666",
"call_in_cnt":"67"
}, {
"sms_cnt":"8",
"cell_phone_r_zh":"中国联通",
"call_out_cnt":"46",
"cell_operator":"chinaunicom",
"call_in_time":"163.68333333333334",
"call_in_cnt":"79"
}, {
"sms_cnt":"2",
"cell_phone_num":"170****3656",
"net_flow":"0.0",
"total_amount":"223.7",
"call_out_time":"21.933333333333334",
"cell_mth":"2017-03",
"cell_loc":"宁夏",
"call_cnt":"87",
"cell_operator_zh":"中国联通",
"call_out_cnt":"26",
"cell_operator":"chinaunicom",
"call_in_time":"76.38333333333334",
"call_in_cnt":"61"
}]
}]
我们需要解析这个字符串,然后做一次聚合操作(聚合这里就不讲了)。
在此之前我们先导入我们需要用到的模块:
那么首先第一个问题,这个字符串非常像json文件,但却不是一个标准的json,所以我们要将他进行正确的格式化,那么现在要做的事情就是将他变成一个标准的json格式。
我们把以上那条字符串叫做string1.
String_format=string1[1:-1]
之后我们就可以将这个字符串转化成Python中的字典(采用json模块的loads方法):
Data_format=json.loads(String_format)
观察一下这个字符串:behavior对应的值是一个列表,在列表的每个数据段都有一些相同的key,那对于此我们应该如何处理。
首先,取出behavior中的值:
Behavior= Data_format[‘behavior’]
然后通过DataFrame转化成数据格式:
Data=pd.DataFrame(Behavior)
之后我们发现以上的数据phone_num是惟一的,我们先把phone_num取出来:
phone_num=[i[‘phone_num’] for i in String_format.apply(json.loads)]
取出string1中的字段,并转化成dataframe,之后将有效字段进行关联:
Data=pd.concat([pd.DataFrame(j) for j in [i[‘behavior’] for i in String_format.apply(json.loads)]])
Userinfo=pd.concat([pd.Series(phone_num,name=’ phone_num’),’Id’],axis= 1)
Connect_data = pd.merge(Data,Userinfo, left_on ='cell_phone_num', right_on='phone_num')
这样数据就处理完毕了。
这就是简单的半结构化数据处理。希望对大家有所帮助。
听说有气质的人都会关注这个公众号!
文章来源: blog.csdn.net,作者:敲代码的灰太狼,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/tongtongjing1765/article/details/100581715
- 点赞
- 收藏
- 关注作者
评论(0)