所以,我有一个JSON文件,它是一个大的,并不断增加。所以,我在这里展示一个简单的版本。
{
"b0:47:bf:af:c1:42":
{
"No. of visits": 10, "cities":
{
"Mumbai": {"count": 5,"last_visited": "5/22/2016"},
"Kolkata": {"count": 2,"last_visited": "5/22/2016"},
"Amritsar":{"count": 3,"last_visited": "5/22/2016"}
}
},
"c0:ee:fb:71:be:0d":
{
"No. of visits": 24, "cities":
{
"Mumbai": {"count": 2,"last_visited": "5/22/2016"},
"Kolkata": {"count": 20,"last_visited": "5/22/2016"},
"Amritsar":{"count": 2,"last_visited": "5/22/2016"}
}
}
}
基本上它包含关于id的信息它基本上是mac_address b0:47:bf:af:c1:42
并且与一个用户相关。所以,我想要的是对JSON进行操作,并将输出存储在数据帧类型的结构中。
就像我想知道用户的最大访问城市和他/她的总访问百分比max_visited城市。
所以,我想要一个类似于以上数据的输出。
mac_address max_vis city %visit to max_vis city
b0:47:bf:af:c1:42 Mumbai 50%
k0:k0:k0:k0:k0:k0 Kolkata 83%
应该使用什么样的工具来简单有效地对JSON进行这种操作。我听说MongoDB可以用于此,但我不知道。之前我试着用python来做这个有没有一种有效的方法来用python来做?所以,如果有人能建议我应该用什么,并给出一些基本的开始,这将是非常有帮助的。由于
您可以这样实现。它是用基本的字典操作实现的。概念是创建一个带有no的列表的列表。访问和城市名称。用键itemgetter
来排序。通过简单的数学运算,得到最大访问城市,并得到百分比。
from operator import itemgetter
for key,value in main_dict.items():
sorted_list = sorted([[val['count'],key1] for key1,val in value['cities'].items()],key=itemgetter(0))[-1]
print [key,sorted_list[1],str(round(float(sorted_list[0])/float(value['No. of visits'])*100,2))+' %']
结果['b0:47:bf:af:c1:42', 'Mumbai', '50.0 %']
['c0:ee:fb:71:be:0d', 'Kolkata', '83.33 %']
您可以使用Python中的json
库。它接受一个字符串,并返回一个dict
,然后您可以解析它。
虽然我对Rahul的回答没有异议,但我认为使用max函数和json.
的基本数据结构更简洁。import json
from collections import OrderedDict
# You load this however you want.
the_string = """{
"b0:47:bf:af:c1:42":
{
"No. of visits": 10, "cities":
{
"Mumbai": {"count": 5,"last_visited": "5/22/2016"},
"Kolkata": {"count": 2,"last_visited": "5/22/2016"},
"Amritsar":{"count": 3,"last_visited": "5/22/2016"}
}
},
"c0:ee:fb:71:be:0d":
{
"No. of visits": 24, "cities":
{
"Mumbai": {"count": 2,"last_visited": "5/22/2016"},
"Kolkata": {"count": 20,"last_visited": "5/22/2016"},
"Amritsar":{"count": 2,"last_visited": "5/22/2016"}
}
}
}"""
print('{:20} {:20s} {:20s}'.format('mac_addr' , 'max_vis_city', '% visits' ))
json_object = json.loads(the_string, object_pairs_hook=OrderedDict)
for item in list(json_object):
max_value = max (json_object[item]["cities"], key=lambda k: json_object[item]["cities"][k]["count"])
print('{:20s} {:20s} {:<20.0f}'.format(item, max_value, round(json_object[item]["cities"][max_value]["count"]/json_object[item]["No. of visits"] * 100)))
输出:mac_addr max_vis_city % visits
b0:47:bf:af:c1:42 Mumbai 50
c0:ee:fb:71:be:0d Kolkata 83