Json 在 python 重命名、删除

Json in python rename, delete

我使用这种结构处理大型 geojson 数据(超过 1 Gb)。 是其中的一部分。

{'type': 'FeatureCollection',
 'crs': {'type': 'name', 'properties': {'name': 'EPSG:4326'}},
 'features': [{'type': 'Feature',
   'properties': {'date_create': '15.03.2008',
    'statecd': '06',
    'cc_date_approval': None,
    'children': None,
    'adate': '23.08.2017',
    'cc_date_entering': '01.01.2014',
    'rifr_cnt': None,
    'parcel_build_attrs': None,
    'rifr': None,
    'sale_date': None,
    'area_unit': '055',
    'util_code': None,
    'util_by_doc': None,
    'area_value': 115558.0,
    'application_date': None,
    'sale': None,
    'cad_unit': '383',
    'kvartal': '69:3:11',
    'parent_id': '69:3:11:248',
    'sale_cnt': None,
    'sale_doc_date': None,
    'date_cost': None,
    'category_type': '003008000000',
    'rifr_dep': None,
    'kvartal_cn': '69:03:0000011',
    'parent_cn': '69:03:0000011:248',
    'cn': '69:03:0000011:245',
    'is_big': False,
    'rifr_dep_info': None,
    'sale_dep': None,
    'sale_dep_uo': None,
    'parcel_build': False,
    'id': '69:3:11:245',
    'address': '',
    'area_type': '009',
    'parcel_type': 'parcel',
    'sale_doc_num': None,
    'sale_doc_type': None,
    'sale_price': None,
    'cad_cost': 139698.06,
    'fp': None,
    'center': {'x': 33.14727379331379, 'y': 55.87764081906541}},
   'geometry': {'type': 'MultiPolygon',
    'coordinates': []},

我需要保存功能 'id' 和 'area_value' 重命名它们并删除其他功能,以便在嵌套的 sheet 中只有这两个键。

而且我必须保存其他数据结构,否则程序无法理解。

我只能检索数据,但不能重写它们。 我用这个方法。 pandas 我有 pd.Dataframe 我知道如何过滤和 select,但我不知道 return 或重写数据。

from pandas.io.json import json_normalize

f = 'data_file_name.json'

with open(f,'r') as dff:
    data = json.loads(dff.read())
    
df = json_normalize(data,record_path=['features'], errors='ignore')
df

此外,我尝试使用 ijson。我这里也有同样的问题

def parse_json(json_filename):
    with open(json_filename, 'rb') as input_file:
        # load json iteratively
        parser = ijson.parse(input_file)
        for prefix, event, value in parser:
            if prefix == 'features.item.properties.id':
                id_val = value
            if prefix == 'features.item.properties.area_value':
                area_val = value
print(id_val)

#             print('prefix={}, event={}, value={}'.format(pref ix, event, value))

            
            
if __name__ == '__main__':
    parse_json('data_file_name.json')
    

谢谢大家!

如果您确定数据是 GeoJSON 并且结构正确,则此答案有效:

要读取 GeoJSON 数据,您可以使用 Geopandas 库:

import geopandas as gpd

gdf = gpd.read_file('data_file_name.json')

这将在 geopandas GeoDataFrame 中加载 GeoJSON 文件,这是一个具有空间分析功能的 pandas 数据框。 你可以阅读更多here

对数据进行操作后,您可以将其导出为 GeoJSON:

gdf.to_file('data_file_name.geojson', driver='GeoJSON')

这将保留 geojson 结构。如果您的进一步分析使用其他软件,您可以将其保存为其他空间格式,例如 Geopackage、shapefile 甚至 CSV 和 WKT 几何格式。