【问题标题】:efficient way to operate on JSON type file对 JSON 类型文件进行操作的有效方法
【发布时间】:2016-06-27 09:22:28
【问题描述】:

所以,我有一个 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 中做到这一点?所以,如果有人能建议我应该使用什么并提供一些基础知识,那将非常有帮助。谢谢

【问题讨论】:

  • 你可以使用json模块来python解析文件,但我不太明白你的问题是什么。
  • @PatrykPerduta 解析很好看我有什么作为输入,而想要的输出count 是没有。他访问城市的次数
  • 您要求我们为您创建完整的解决方案?
  • @PatrykPerduta 正如我所提到的,这只是整个问题的一小部分,而不是解决方案,“所以,如果有人能建议我应该使用什么并提供一些基础知识,那将非常有帮助。”当我用这句话结束问题时。
  • 感谢您的解释。您需要分析的文件有多大?您已经有了一些解决方案,但它太慢了,或者您只是因为文件很大而估计这很慢?

标签: python json mongodb data-analysis bigdata


【解决方案1】:

你是这样实现的。它是用基本的字典操作来实现的。该概念是创建具有访问次数和城市名称的列表列表。并且使用密钥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 %']

【讨论】:

    【解决方案2】:

    您可以在 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
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2016-12-16
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      相关资源
      最近更新 更多