我有一个由包含字典的数组组成的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}}
答案 0 :(得分: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}}
}
如果您希望将结果放入数组中,请使用res.values()
。
答案 1 :(得分:1)
您可以简单地解析数据并按以下方式进行计数:
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}}]
答案 2 :(得分:1)
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