使用 Python 从 JSON 嵌套列表和字符串数组中提取值
Posted
技术标签:
【中文标题】使用 Python 从 JSON 嵌套列表和字符串数组中提取值【英文标题】:Extract values from JSON nested list and string array with Python 【发布时间】:2020-11-07 19:58:55 【问题描述】:我正在尝试从 JSON 数据集中提取马萨诸塞州波士顿多个社区的坐标,但我一直在尝试仅获取每个城市的第一个坐标对;下面是罗斯林代尔坐标的一个小版本。
"features": [
"type": "Feature",
"properties":
"Name": "Roslindale",
"Acres": 1605.5682375,
"SqMiles": 2.51,
,
"geometry":
"type": "MultiPolygon",
"coordinates": [
[
[
[
-71.125927174853857,
42.272013107957406
],
[
-71.125927174853857,
42.272013107957406
]
]
],
[
[
[
-71.125830766767592,
42.272212845889705
],
[
-71.125830766767592,
42.272212845889705
]
]
],
[
[
[
-71.125767203228904,
42.272315958536389
],
[
-71.125767203228904,
42.272315958536389
]
]
]
]
,
现在我已经提取了我想要使用的数据
for data in boston_neighborhoods:
neighborhood_name = data['properties']['Name']
neighborhood_id = data['properties']['Neighborhood_ID']
neighborhood_size = data['properties']['SqMiles']
neighborhood_latlon = data['geometry']['coordinates']
neighborhood_lat = neighborhood_latlon
neighborhood_lon = neighborhood_latlon
neighborhoods = neighborhoods.append('Neighborhood': neighborhood_name,
'Neighborhood_ID': neighborhood_id,
'SqMiles': neighborhood_size,
'Latitude': neighborhood_lat,
'Longitude': neighborhood_lon, ignore_index=True)
这会返回多个坐标对,但我只想要第一对,下面是我现在返回的示例输出:
Latitude | Longitude
--------------------------------------------------------
[[[[-71.12592717485386, | [[[[-71.12592717485386,
42.272013107957406], [... | 42.272013107957406], [...
【问题讨论】:
基本上你需要在一列中的纬度和另一列中的所有长? 是的,这会有所帮助,但每个城市大约有 1200 个纬度和经度对,我只想拉每个城市的第一对。 【参考方案1】:可能有点矫枉过正,但JMESPath
让查询嵌套 JSON 结构变得非常容易。
遍历文档,您首先需要获取数组中的每个元素 ([*]
),然后为每个元素选择一个对象(Python 字典)中的项目。您将选择properties
下的邻域,然后选择Name
(properties.Name
)。您对类似的嵌套属性执行相同操作。
坐标位于geometry.coordinates
下,这是一个由坐标对数组组成的数组。
import jmespath
import pandas as pd
query = """
[*].
Neighborhood: properties.Name,
Neighborhood_ID: properties.Neighborhood_ID,
SqMiles: properties.SqMiles,
Latitude: geometry.coordinates[0][0][0][0],
Longitude: geometry.coordinates[0][0][0][1]
"""
compiled = jmespath.compile(query)
result = compiled.search(boston_neighborhoods)
df = pd.DataFrame.from_records(result)
# Neighborhood Neighborhood_ID SqMiles Latitude Longitude
# 0 Roslindale None 2.51 -71.125927 42.272013
【讨论】:
非常好的答案,不知道JMESPath,谢谢分享! +1 :)以上是关于使用 Python 从 JSON 嵌套列表和字符串数组中提取值的主要内容,如果未能解决你的问题,请参考以下文章
使用 Javascript 从 json 数据中动态嵌套 ul\li 列表