所以,我有一个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的信息,该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中做到这一点?所以,如果有人可以建议我应该使用什么,并给出一些基础知识开始将是非常有帮助的。感谢
答案 0 :(得分:1)
你这样实现。它实现了基本的字典操作。该概念创建了一个列表,其中包含no.of访问和城市名称。并使用密钥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 %']
答案 1 :(得分:0)
您可以在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