我有一个这种形式的大量 geo json:
{'features': [{'properties': {'MARKET': 'Albany',
'geometry': {'coordinates': [[[-74.264948, 42.419877, 0],
[-74.262041, 42.425856, 0],
[-74.261175, 42.427631, 0],
[-74.260384, 42.429253, 0]]],
'type': 'Polygon'}}},
{'properties': {'MARKET': 'Albany',
'geometry': {'coordinates': [[[-73.929627, 42.078788, 0],
[-73.929114, 42.081658, 0]]],
'type': 'Polygon'}}},
{'properties': {'MARKET': 'Albuquerque',
'geometry': {'coordinates': [[[-74.769198, 43.114089, 0],
[-74.76786, 43.114496, 0],
[-74.766474, 43.114656, 0]]],
'type': 'Polygon'}}}],
'type': 'FeatureCollection'}
读取 json 后:
import json
with open('x.json') as f:
data = json.load(f)
我将值读入列表,然后读入数据框:
#to get a list of all markets
mkt=set([f['properties']['MARKET'] for f in data['features']])
#to create a list of market and associated lat long
markets=[(market,list(chain.from_iterable(f['geometry']['coordinates']))) for f in data['features'] for market in mkt if f['properties']['MARKET']==mkt]
df = pd.DataFrame(markets[0:], columns=['a','b'])
df 的前几行是:
a b
0 Albany [[-74.264948, 42.419877, 0], [-74.262041, 42.4...
1 Albany [[-73.929627, 42.078788, 0], [-73.929114, 42.0...
2 Albany [[-74.769198, 43.114089, 0], [-74.76786, 43.11...
然后为了解除 b 列中的嵌套列表,我使用 pandas concat
:
df1 = pd.concat([df.iloc[:,0:1], df['b'].apply(pd.Series)], axis=1)
但这是创建了 8070 个包含许多 NaN 的列。有没有办法按市场(a 列)对所有纬度和经度进行分组?需要一百万行乘以两列数据框。
所需的操作是:
mkt lat long
Albany 42.419877 -74.264948
Albany 42.078788 -73.929627
..
Albuquerque 35.105361 -106.640342
请注意,需要忽略列表元素 ([-74.769198, 43.114089, 0]) 中的零。
原文由 skrubber 发布,翻译遵循 CC BY-SA 4.0 许可协议
像这样的东西??
输出:
如果: