Python处理非规范的JSON文件

处理数据说明

在Python中,处理JSON数据类型是经常会用到的处理,多是把不规范的JSON转换成DataFrame的数据类型,
通过将数据类型转换成这种半结构的数据转换为结构化数据。  
JSON数据类型-DataFrame数据-处理DataFrame数据类型数据

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#! /usr/bin/python
# -*- coding:utf-8 -*-
# Python3.x
import pandas as pd
import json

# 函数加方法<三步+ open file.read file.close
filename = "C:\\Data01.json"
filename1="C:\\out.a"
filename2="C:\\out.csv"

 # open函数用于打开一个文件,创建一个 file 对象
 #使用方法读取数据-- .read()、.readline() 和 .readlines()
#.read() 返回从字符串中读取的字符 fileobj.read()# 从文件中读取指定的字符数,如果未给定或为负则读取所有。
#.readline() 每次只读取一行 -仅当没有足够内存可以一次读取整个文件时,使用 .readline()#方法返回一个字符串对象
# readlines()方法 读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素
with open(filename, mode='r',encoding='utf-8') as fileobj:
stringlist = fileobj.readlines

# 创建一个空的 DataFrame
df_empty = pd.DataFrame(columns=['id', 'a', 'b'])
# 统计行数
count = 0

# Json   模块提供了四个方法: dumps、dump、loads、load
# 序列化  dumps、dump
# 反序列化方法loads、load
for line in stringlist:
   sdata = json.loads(line)
   event = dict()
#利用dict内置的get(key[,default])方法,如果key存在,则返回其value,否则返回default
   event["id"] = sdata.get("id", "not-exist")
   event["a"] = sdata.get("a",1)
   event["b"] = sdata.get("b", 0)
   df_empty= df_empty.append(event, ignore_index=True)
   # 统计行数
   count = count + 1

# 数据筛选
df_empty.to_csv(filename1, index=False)
DataDF =  pd.read_csv(filename1, sep=',')
ratio = pd.DataFrame( (DataDF['a']-DataDF['b'])/DataDF['a'],columns=['ratio'])
#产生新列#
result = pd.concat([DataDF,ratio],axis=1)
#过滤和筛选
resData = result[result["ratio"]<0.5].reset_index()
resData.to_csv(filename2, index=False, header=True)

#数据库风格的DataFrame的连接pd.merge(df1, df2,on="key",how='left',suffixes=('_ef','_rig'))
## 索引的连接parsecap = result.join(
# data_tmp = json.dumps(json.loads(json.dumps(json.loads(urlDF['handicap'][res]))))
#jsontmp = json.loads(data_tmp)

迭代的代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#! /usr/bin/python
# -*- coding:utf-8 -*-
# 将不规则的JSON转化为规则的DataFrame=缺省值给默认值

import pandas as pd
import json

findata_list = []
count = 0
filename = "C:\\Usein.json"
with open(filename, mode='r',encoding='utf-8') as fileobj:
    for line in fileobj.readlines():
        sdata = json.loads(line)
        event = dict()
        # 利用dict内置的get(key[,default])方法,如果key存在,则返回其value,否则返回default
        count = count + 1
        print(count)
        tmp = (sdata.get("id", "not-exist"), sdata.get("a", 0), sdata.get("b", 0))
        findata_list.append(tmp)
    dfquery = pd.DataFrame(findata_list)
# 迭代版本二#  列表推导式
findata_list2 = []
count2 = 0
with open(filename, mode='r',encoding='utf-8') as fileobj:
    sdata2= [json.loads(line) for line in fileobj.readlines()]
    for i in range(len(sdata2)):
        count2 = count2 + 1
        print(count2)
        tmp = (sdata2[i].get("id", "not-exist"), sdata2[i].get("a", 0), sdata2[i].get("b", 0))
        findata_list2.append(tmp)
    dfquery = pd.DataFrame(findata_list2)
#
filenameDF = "C:\\UseinDF.csv"
print("ready to write data to File")
dfquery.to_csv(filenameDF, index=False,header=False)

#读取数据
print("ready to read data ")
DataDF =  pd.read_csv(filenameDF, sep=',', names = ['id','a','b'],header=0)

#产生新列#
# reindex()方法可以添加一列或多列数据,并且可以指定列的位置,也可以对原先存在的列进行重排
ratio = pd.DataFrame((DataDF['a']-DataDF['b'])/DataDF['a'],columns=['ratio'])
dataDiff = pd.DataFrame((DataDF['a']-DataDF['b']),columns=['dataDiff'])
result = pd.concat([DataDF,ratio,dataDiff],axis=1)

#过滤和筛选
print("filter the data")
#resData = result[result["ratio"]<0.1 & result["dataDiff"]<10 & result["a"]>0].reset_index(drop=True)
resData = result.query( 'ratio<0.1  & dataDiff<10 & a> 0')

# 保存数据
Dataout=  "C:\\UserlastData.csv"
resData.to_csv(Dataout, index=False, header=True)

R语言处理结构化数据

在R语言中,处理非规范的JSON,稍微有一些不便,不过随着R语言的发展,这些会在一定程度上缓解,而且R语言在数据统计上的优势,可以让我们集中精力在数据的洞察中
R语言:
library(readr)
library(dplyr)
ash <- read_delim("C:/Users/ash.txt",  "\t", escape_double = FALSE, col_names = FALSE,
   col_types = cols(X1 = col_character()),trim_ws = TRUE)
#已知的变量创建新的变量  round(mean(x),2)
Cash <- mutate(ash,ratio= round((X2-X3)/X2*1.0,digits =4) )
#根据值选择观察(记录)
resultData  <- filter(Cash, X2>=50, ratio < 0.5)
colnames(resultData) <- c('a','b','c','ratio')
#left_join
#保存数据
write_csv(resultData,path='C:/Users/Filter.csv')

总结

数据结构类似-有差异的地方也不少
调用方法或者函数-- 输入-输出值类型-参数
    Python中多是类方法或者实例方法,函数不常用
    R语言多是函数
Python 在填充数据的时候,使用list等数据结构填充,填充结束后转换为Dataframe,这样速度会快很多

blogroll

social