【问题标题】:How to count a value with JSON based on another value in the JSON file如何根据 JSON 文件中的另一个值用 JSON 计算一个值
【发布时间】:2018-12-31 21:26:58
【问题描述】:

我有一个由包含字典的数组组成的 JSON 文件,每个字典都是买家对特定车库的意见。 我想知道每个车库中每辆车的类型出现了多少次,它看起来像这样:

[
  {"garage": "mike_gar", "reliability": 6, "car_type": "ford", "time": "16:10:36"},
  {"garage": "bill_gar", "reliability": 5,"car_type": "kia", "time": "4:37:22"},
  {"garage": "alison_gar", "reliability": 1, "car_type": "kia", "time": "11:25:40"},
  {"garage": "alison_gar", "reliability": 10, "car_type": "mazda", "time": "2:18:42"},
  {"garage": "mike_gar", "reliability": 3, "car_type": "mazda", "time": "12:14:20"},
  {"garage": "mike_gar", "reliability": 2, "car_type": "ford", "time": "2:08:27"}
]

假设我们已经从 JSON 文件中读取到变量 g_arr。 我尝试使用 reduce() 来计算出现次数,但未能成功。

输出示例: {"garage" : "mike_gar", "types":{"ford" : 2, "mazda": 1}}

【问题讨论】:

  • 车库的主人是杰森吗?
  • @wim 我认为它应该是 JSON。解决了这个问题。
  • @wim opppsss...
  • @Shelly875 我想你会发现this answer 很有帮助。让我们知道这是否能解决您的问题。它不是完全相同的副本,但关系非常密切。

标签: python json dictionary


【解决方案1】:

这是一个基于缩减的解决方案。首先,我测试积累字典中是否存在车库,如果没有,则创建它。然后,我检查车库字典中是否存在汽车类型,如果不存在,则创建它。最后,我增加汽车类型。

res = {}

for d in garages:
    if d["garage"] not in res:
        res[d["garage"]] = {"garage": d["garage"], "types": {}}

    if d["car_type"] not in res[d["garage"]]["types"]:
        res[d["garage"]]["types"][d["car_type"]] = 0

    res[d["garage"]]["types"][d["car_type"]] += 1

输出:

{
  'mike_gar': {'garage': 'mike_gar', 'types': {'ford': 2, 'mazda': 1}},
  'bill_gar': {'garage': 'bill_gar', 'types': {'kia': 1}}, 
  'alison_gar': {'garage': 'alison_gar', 'types': {'kia': 1, 'mazda': 1}}
}

Try it!

如果您希望将结果保存在数组中,请使用 res.values()

【讨论】:

  • 那是一个Javascript解决方案,问题有一个Python标签。
  • 我已经尝试了代码,这正是我想要的!谢谢你:)
【解决方案2】:

您可以简单地解析您的数据并按以下方式进行计数:

garages = []
cars = []
output = []

for element in data:
    if element['garage'] not in garages: garages.append(element['garage'])
    if element['car_type'] not in cars: cars.append(element['car_type'])

for type in garages:
    current = {}
    current['types'] = {}
    current['garage'] = type
    for element in data:
        if element['car_type'] not in current['types']:
            current['types'][element['car_type']]=0

        if current['garage'] == element['garage']:
            for car_type in cars:
                if element['car_type'] == car_type:
                    current['types'][element['car_type']]+=1
    output.append(current)

print output

执行上面的输出是:

[{'garage': 'mike_gar', 'types': {'mazda': 1, 'kia': 0, 'ford': 2}}, {'garage': 'bill_gar', 'types': {'mazda': 0, 'kia': 1, 'ford': 0}}, {'garage': 'alison_gar', 'types': {'mazda': 1, 'kia': 1, 'ford': 0}}]

【讨论】:

    【解决方案3】:

    Pandas 包非常适合处理此类数据。您可以轻松地将列表转换为 Pandas 数据框。

    import pandas as pd
    
    df = pd.DataFrame(g_arr)
    print(df)
    

    打印:

      car_type      garage  reliability      time
    0     ford    mike_gar            6  16:10:36
    1      kia    bill_gar            5   4:37:22
    2      kia  alison_gar            1  11:25:40
    3    mazda  alison_gar           10   2:18:42
    4    mazda    mike_gar            3  12:14:20
    5     ford    mike_gar            2   2:08:27
    

    您可以使用.groupby() 方法对数据进行分组,并使用.size() 方法获取每组的行数。

    print(df.groupby(['garage', 'car_type']).size())
    

    打印:

    garage      car_type
    alison_gar  kia         1
                mazda       1
    bill_gar    kia         1
    mike_gar    ford        2
                mazda       1
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多