【问题标题】:how to add information to json using Python in fast way如何使用 Python 快速向 json 添加信息
【发布时间】:2014-05-24 11:48:06
【问题描述】:

我有包含地点的 geojson 文件。其中 "'parking': 0 " 一直都是。

'type': 'Feature', 
'properties': {
 ...// Other fields
'latitude': -74.0121613846062,
'longitude': 40.7043040747924,
'parking': 0 }

我想从另一个 csv 文件数据集更新它。

-------------------------------------------
 latitude    + Longitude + Possible_parking 
-------------------------------------------
-74.012161      40.804        -1

-1:无法停车

1:可能停车

我想更新 geojson 文件。

data = pd.read_csv("data/_all.csv")

geojson_in = open('data/input.json', 'r')
tracts_geojson = json.load(geojson_in)
geojson_in.close()


# For each record in the geojson file, add location information
for i, r in enumerate(tracts_geojson['features']):
    for x in range(len(data.latitude.values)):
        if ((r['properties']['latitude']==data["latitude"][x]) and (r['properties']['longitude']== data["longitude"][x])):
            r['properties']['parking'] = str(data['Possible_parking'][x])

我使用的脚本的问题是它需要很长时间(现在 +24 小时)。 我不想直接将 csv 文件转换为 json,因为 input.json 包含我在 CSV 文件中找不到的其他信息。

有没有什么pythonic方法可以更快地做到这一点?

【问题讨论】:

  • CSV 文件有多大?
  • CSV 文件大小为:600Mb

标签: python json csv pandas


【解决方案1】:

您正在循环遍历 JSON 文件中每个功能的整个停车 CSV 行;这是一个 N * M 循环;一个 600MB 的 CSV 文件包含大约 3000 万个停车位条目(每行大约 21 个字节),并且您正在循环遍历所有 3000 万个每个功能

您想将整个 CSV 文件加载到字典中:

import csv

with open(("data/_all.csv", 'rb') as incsv:
    reader = csv.reader(incsv)
    next(reader, None)  # skip presumed header
    parking = {(lat, long): park for lat, long, park in reader}

使用它而不是为每个 JSON 条目循环遍历整个数据集:

for feat in tracts_geojson['features']:
    lat, long = feat['properties']['latitude'], feat['properties']['longitude']
    if (lat, long) in parking:
        feat['properties']['parking'] = parking[lat, long]

在字典中查找需要固定的时间;您现在对每个功能使用一次直接查找,而不是每个功能 3000 万次循环。

【讨论】:

  • 哈希之美。
  • 您是否碰巧知道字典理解在必须调整大小的 dict 方面的表现?它是根据可迭代的长度分配字典的大小一次,还是会在 2/3 满之前一遍又一遍地调整大小?
  • @LukasGraf:它会动态调整大小,就像您一个一个添加项目一样。
  • @LukasGraf:使用的 OPCODES 确实允许预先确定大小,但 Python 的动态特性不允许在这里预先预测大小。这样BUILD_MAP 0就完成了(创建空字典,不是presized),然后每次迭代MAP_ADD都会被执行,基本上就是dict.__setitem__()调用。
  • 谢谢!我使用 pandas/zip 重新编写了第一部分,使其更加 Pythonic(更新)。
猜你喜欢
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多