Python从Json字符串中提取元素 [英] Python extract elements from Json string

查看:437
本文介绍了Python从Json字符串中提取元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Json字符串,可以从中提取 formatted_address lat lng ,但是我无法提取其他组件的特征(值),如交叉点,政治,国家,administrative_area_level_1,administrative_area_level_2,administrative_area_level_3,administrative_area_level_4,administrative_area_level_5,colloquial_area,位于 long_name
之前的位置,病房,邻域,前提,子级等等
我期待数据表如$ /

  formatted_address px_val py_val political country administrative_area_level_1 .. .. 
Satya Niwas,Kanti Nagar .. 19.1096591 72.8674712 Kanti Nagar,JB Nagar印度马哈拉施特拉邦.. ..
82,Bamanpuri,Ajit Nagar .. 19.109749 72.867249 Bamanpuri印度马哈拉施特拉邦.. ..



以下是示例JSON字符串

' ':['establishment','point_of_interest','premise']},
{'long_name':'Kanti Nagar',
'short_name':'Kanti Nagar',
'types ':['political','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar',
'short_name':'JB Nagar',
' ':['political','sublocality','sublocality_level_2']},
{'long_name':'Andheri East',
'short_name':'Andheri East',
'types ':['political','sublocality','sublocality_level_1']},
{'long_name':'Mumbai',
'short_name':'Mumbai',
'types': ['locality','political']},
{'long_name':'Mumbai Suburban',
'short_name':'孟买郊区',
'types':['administrative_area_level_2','political']},
{'long_name' :'Maharashtra',
'short_name':'MH',
'types':['administrative_area_level_1','political']},
{'long_name':'India',
'short_name':'IN',
'types':['country','political']},
{'long_name':'400059','short_name':'400059' ,'types':['postal_code']}],
'formatted_address':'Satya Niwas,Kanti Nagar,JB Nagar,Andheri East,Mumbai,Maharashtra 400059,India',
'geometry': {'bounds':{'northeast':{'lat':19.1097923,'lng':72.8675306},
'southwest':{'lat':19.1095784,'lng':72.8673391}},
'location':{'lat':19.1096591,'lng':72.8674712},
'location_type':'ROOFTOP ',
'viewport':{'northeast':{'lat':19.1110343302915,
'lng':72.8687838302915},
'southwest':{'lat':19.1083363697085'lng ':72.86608586970848}}},
'place_id':'ChIJ4UsP5DjI5zsR8hgwhHo9wEk',
'types':['establishment','point_of_interest','premise']},
{'address_components' :['long_name':'82',
'short_name':'82',
'types':['premise']},
{'long_name':'Bamanpuri' ,
'short_name':'Bamanpuri',
'types':['neighborhood','political']},
{'long_name':'Ajit Nagar',
'short_name':'Ajit Nagar',
'types':['political','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar',
'short_name':'JB Nagar',
'types':['political','sublocality','sublocality_level_2 ]},
{'long_name':'Andheri East',
'short_name':'Andheri East',
'types':['political','sublocality','sublocality_level_1' ]},
{'long_name':'Mumbai',
'short_name':'Mumbai',
'types':['locality','political']},
{'long_name':'Mumbai Suburban',
'short_name':'Mumbai Suburban',
'types':['administrative_area_level_2','political']},
{'long_name ':'Maharashtra',
'short_name':'MH',
'types':['administrative_area_level_1','political']},
{'long_name':'印度',
'short_name':'IN',
'types':['country','political']},
{'long_name':'400053','short_name':'400053 ','types':['postal_code']}],
'formatted_address':'82,Bamanpuri,Ajit Nagar,JB Nagar,Andheri E孟买,马哈拉施特拉邦400053,印度',
'几何':{'location':{'lat':19.109749,'lng':72.867249},
'location_type':'ROOFTOP',
'viewport':{'northeast':{'lat':19.1110979802915,
'lng':72.8685979802915},
'southwest':{'lat':19.1084000197085,'lng':72.86590001970849 }}},
'place_id':'ChIJqYip4zjI5zsR0Yg8bdXQX3o',
'types':['street_address']},
{'address_components':[{'long_name':'Todi Building' ,
'short_name':'Todi Building',
'types':['premise']},
{'long_name':'Sheth Bhavanidas Benani Marg',
' short_name':'Sheth Bhavanidas Benani Marg',
'types':['route']},
{'long_name':'Kanti Nagar',
'short_name':'Kanti Nagar ',
'types':['political','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar',
'short_name':'JB Nagar',
'types':['political','sublocality','sublocality_level_2']},
{'long_name':'Andheri East',
'short_name':'Andheri East',
'types':['political','sublocality','sublocality_level_1']},
{'long_name':'Mumbai',
'short_name':'Mumbai',
'types':['locality','political']},
{'long_name':'孟买Suburban',
'short_name':'孟买Suburban',
'类型':['administrative_area_level_2','political']},
{'long_name':'Maharashtra',
'short_name':'MH',
'types':['administrative_area_level_1','political']},
{'long_name':'印度',
'short_name' :'IN',
'types':['country','political']},
{'long_name :'400059','short_name':'400059','types':['postal_code']}],
'formatted_address':'Todi Building,Sheth Bhavanidas Benani Marg,Kanti Nagar,JB Nagar,Andheri East ,孟买,马哈拉施特拉邦400059,印度',
'几何':{'location':{'lat':19.1098265,'lng':72.86778869999999},
'location_type':'ROOFTOP',
'viewport':{'northeast':{'lat':19.1111754802915,
'lng':72.86913768029149},
'southwest':{'lat':19.1084775197085,'lng':72.86643971970848} }},
'place_id':'ChIJo5bq3zjI5zsR2hRaNQF3xd0',
'types':['premise']},
{'address_components':[{'long_name':'KASI APARTMENTS',
'short_name':'KASI APARTMENTS',
'types':['establishment','point_of_interest','premise']},
{'long_name':'Shriniwas Bagarka Road' ,
'short_name':'Shriniwas B agarka Rd',
'types':['route']},
{'long_name':'Bamanpuri',
'short_name':'Bamanpuri',
' ':['neighborhood','political']},
{'long_name':'Kanti Nagar',
'short_name':'Kanti Nagar',
'types':[''政治','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar',
'short_name':'JB Nagar',
'types':[政治','sublocality','sublocality_level_2']},
{'long_name':'Andheri East',
'short_name':'Andheri East',
'types':[政治','sublocality','sublocality_level_1']},
{'long_name':'Mumbai',
'short_name':'孟买',
'types':['locality' ,'政治']},
{'long_name':'孟买郊区',
'short_name':'孟买郊区',
'types':['administrative_area_level_2','political']},
{'long_name':'Maharashtra',
'short_name':'MH',
'types':[''政治']},
{'long_name':'印度',
'short_name':'IN',
'types':['country','political' ]},
{'long_name':'400059','short_name':'400059','types':['postal_code']}],$ b $'formatted_address':'KASI APARTMENTS,Shriniwas Bagarka Rd,Bamanpuri,Kanti Nagar,JB Nagar,Andheri East,Mumbai,Maharashtra 400059,India',
'geometry':{'location':{'lat':19.1093338,'lng':72.8670515},
'location_type':'ROOFTOP',
'viewport':{'northeast':{'lat':19.1106827802915,
'lng':72.86840048029151},
'southwest':{ 'lat':19.10798481970849,'lng':72.86570251970849}}},
'place_id :'ChIJoUz25DjI5zsRiMoiQtq5kXs',
'types':['establishment','point_of_interest','premise']},
{'address_components':[{'long_name':'Silver Line Apts。',
'short_name':'Silver Line Apts。',
'types':['premise']},
{'long_name':'Bamanpuri',
'short_name' :'Bamanpuri',
'types':['neighborhood','political']},
{'long_name':'JB Nagar',
'short_name':'J.B. Nagar',
'types':['political','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar',
'short_name':'JB Nagar',
'类型':['political','sublocality','sublocality_level_2']},
{'long_name':'Andheri East',
'short_name':'Andheri东孟',
'类型':['political','sublocality','sublocality_level_1']},
{'long_name':'孟买',
'short_name':'孟买' ,
'types':['locality','political']},
{'long_name':'孟买郊区',
'short_name':'Mumbai Suburban',
'types':['administrative_area_level_2','political']},
{'long_name':'Maharashtra',
'short_name':'MH',
'types':[ 'administrative_area_level_1','political']},
{'long_name':'印度',
'笑rt_name':'IN',
'types':['country','political']},
{'long_name':'400047','short_name':'400047','types' :['postal_code']}],
'formatted_address':'Silver Line Apts。,Bamanpuri,JB Nagar,JB Nagar,Andheri East,Mumbai,Maharashtra 400047,India',
'geometry' {'location':{'lat':19.1091075,'lng':72.8670776},
'location_type':'ROOFTOP',
'viewport':{'northeast':{'lat':19.1104564802915 ,
'lng':72.86842658029151},
'southwest':{'lat':19.1077585197085,'lng':72.86572861970849}}},
'place_id':'ChIJEQ3_ZzjI5zsR9LxIP1h2b2c',
'types':['premise']},
{'address_components':[{'long_name':'Gokul panch chs',
'short_name':'Gokul panch chs',
'types':['establishment','point_of_interest']},
{'long_name':'81 -B ','short_name':'81-B','types':['street_number']},
{'long_name':'Sheth Bhavanidas Benani Marg',
'short_name':'Sheth Bhavanidas Benani Marg',
'types':['route']},
{'long_name':'Bamanpuri',
'short_name':'Bamanpuri',
' ':['neighborhood','political']},
{'long_name':'Ajit Nagar',
'short_name':'Ajit Nagar',
'types':[''政治','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar',
'short_name':'JB Nagar',
'types':[政治','sublocality','sublocality_level_2']},
{'long_name':'Andheri East',
'short_name':'Andheri East',
'types':[政治','sublocality','sublocality_level_1']},
{'long_name':'孟买',
'short_name': '孟买',
'类型':['locality','political']},
{'long_name':'孟买郊区',
'short_name':'孟买郊区',
'types':['administrative_area_level_2','political']},
{'long_name':'Maharashtra',
'short_name':'MH',
' ':['administrative_area_level_1','political']},
{'long_name':'印度',
'short_name':'IN',
'types':['country' '''','''''','''''''''','''''''''','印度马哈拉施特拉邦,印度孟买,印度孟加拉国安得里东JBit Nagar,Aj Nagar,印度孟加拉国,81-B,81-B,Sheth Bhavanidas Benani Marg,Bamanpuri,'''''''''' lat':19.1098713,'lng':72.86705669999999},
'location_type':'ROOFTOP',
'viewpo rt':{'northeast':{'lat':19.1112202802915,
'lng':72.8684056802915},
'southwest':{'lat':19.1085223197085,'lng':72.8657077197085}}},
'place_id':'ChIJpUuz4jjI5zsRpgQdmR5E1v0',
'types':['establishment','point_of_interest']},
{'address_components':[{'long_name':'Ajit Nagar' ,
'short_name':'Ajit Nagar',
'types':['political','sublocality','sublocality_level_3']},
{'long_name':'JB Nagar' ,
'short_name':'JB Nagar',
'types':['political','sublocality','sublocality_level_2']},
{'long_name':'Andheri East' ,
'short_name':'Andheri East',
'types':['political','sublocality','sublocality_level_1']},
{'long_name':'Mumbai',
'short_name':'孟买',
'类型':['locality ','political']},
{'long_name':'Mumbai Suburban',
'short_name':'孟买郊区',
'类型':['administrative_area_level_2','political ']},
{'long_name':'Maharashtra',
'short_name':'MH',
'types':['administrative_area_level_1','political']},
{'long_name':'India',
'short_name':'IN',
'types':['country','political']},
{'long_name' :'400047','short_name':'400047','types':['postal_code']}],
'formatted_address':'Ajit Nagar,JB Nagar,Andheri East,Mumbai,Maharashtra 400047,India' ,
'geometry':{'bounds':{'northeast':{'lat':19.1119198,'lng':72.8714133},
'southwest':{'lat':19.1085396,'lng ':72.8662167}},
'location':{'lat':19.1103164,'lng':72.8680732},
'location_type ':'APPROXIMATE',
'viewport':{'northeast':{'lat':19.1119198,'lng':72.8714133},
'southwest':{'lat':19.1085396,'lng ':72.8662167}}},
'place_id':'ChIJPWPg4zjI5zsRJWPFphEkcxc',
'types':['political','sublocality','sublocality_level_3']},
{'address_components' :[{'long_name':'Bamanpuri',
'short_name':'Bamanpuri',
'types':['neighborhood','political']},
{'long_name' :'JB Nagar',
'short_name':'JB Nagar',
'types':['political','sublocality','sublocality_level_2']},
{'long_name' :'Andheri East',
'short_name':'Andheri East',
'types':['political','sublocality','sublocality_level_1']},
{'long_name' :'孟买',
'short_name':'孟买',
'类型':['locality', ''政治']},
{'long_name':'孟买郊区',
'short_name':'孟买郊区',
'类型':['administrative_area_level_2','political'] },
{'long_name':'Maharashtra',
'short_name':'MH',
'types':['administrative_area_level_1','political']},
{'long_name':'印度',
'short_name':'IN',
'types':['country','political']},
{'long_name':' 400047','short_name':'400047','types':['postal_code']}],
'formatted_address':'Bamanpuri,JB Nagar,Andheri East,Mumbai,Maharashtra 400047,India $ b'geometry':{'bounds':{'northeast':{'lat':19.1102874,'lng':72.869838},
'southwest':{'lat':19.1060651,'lng':72.8635609 }},
'location':{'lat':19.1084347,'lng':72.86574929999999},
'location_typ e':'APPROXIMATE',
'viewport':{'northeast':{'lat':19.1102874,'lng':72.869838},
'southwest':{'lat':19.1060651' lng':72.8635609}}},
'place_id':'ChIJIYgnUDjI5zsRK_Zl9Zy_QkY',
'types':['neighborhood','political']},
{'address_components':[ 'long_name':'JB Nagar',
'short_name':'JB Nagar',
'types':['political','sublocality','sublocality_level_2']},
{ 'long_name':'Andheri East',
'short_name':'Andheri East',
'types':['political','sublocality','sublocality_level_1']},
{ 'long_name':'孟买',
'short_name':'孟买',
'类型':['locality','political']},
{'long_name':'Mumbai Suburban',
'short_name':'Mumbai Suburban',
'types':['administrative_area_level_2' ,'政治']},
{'long_name':'Maharashtra',
'short_name':'MH',
'types':['administrative_area_level_1','political']} ,
{'long_name':'印度',
'short_name':'IN',
'types':['country','political']},
{ 'long_name':'400047','short_name':'400047','types':['postal_code']}],
'formatted_address':'JB Nagar,Andheri East,Mumbai,Maharashtra 400047,India' ,
'geometry':{'bounds':{'northeast':{'lat':19.1161579,'lng':72.871533},
'southwest':{'lat':19.1008041,'lng ':72.8606231}},
'location':{'lat':19.1110621,'lng':72.8655922},
'location_type':'APPROXIMATE',$ b $'viewport':{东北部':{'lat':19.1161579,'lng':72.871533},
'southwest':{'lat':19.1008041,'lng':72.8606231}}},
'place_id':'ChIJt8_u6TjI5zsRR9eE5rMK45A',
'types':['political','sublocality','sublocality_level_2']},
{'address_components':[{'long_name':'Andheri East' ,
'short_name':'Andheri East',
'types':['political','sublocality','sublocality_level_1']},
{'long_name':'Mumbai',
'short_name':'孟买',
'types':['locality','political']},
{'long_name':'Mumbai Suburban',
' short_name':'孟买郊区',
'types':['administrative_area_level_2','political']},
{'long_name':'Maharashtra',
'short_name':'MH ',
'types':['administrative_area_level_1','political']},
{'long_name':'India',
'short_name':'IN',
'types':['country','political']}],
'formatted_address ':'Andheri East,Mumbai,Maharashtra,India',
'geometry':{'bounds':{'northeast':{'lat':19.1327276,$ b'lng':72.89305499999999},
'southwest':{'lat':19.096748,'lng':72.843926}},
'location':{'lat':19.1154908,'lng':72.8726952},
'location_type ':'APPROXIMATE',
'viewport':{'northeast':{'lat':19.1327276,'lng':72.89305499999999},
'southwest':{'lat':19.096748,'lng ':72.843926}},
'place_id':'ChIJMbHfQRu25zsRMazdY3UpaKY',
'types':['political','sublocality','sublocality_level_1']}],
'status' :'OK'}

以下是代码片段

  import json 
将pandas导入为pd
line =json_str
json_st = json.loads(line)
国家= []
political = []
address_fields = {
'相交':[],
'political':[],
'country':[]
}

用于json_st中的json_str:
address_fields = {

'intersection':[],
'political':[],
'country':[]
}
isinstance json_st,dict):
first_address_components = json_st ['results']
#format_add = json_st ['results'] [0]
else:
first_address_components = json_st [0] [ 'address_components']
for first_address_components:

for field_key in address_fields.keys():
#address_fields [field_key] .append(str(format_add ['formatted_address'] ))
如果item ['types']中的field_key:
address_fields [field_key] .append(item ['long_name'])

address_fields = {key:', .join(值)的键值,在address_fields.items()}
coun try.append(address_fields ['country'])
political.append(address_fields ['political'])

给出错误

$ pre $ j $ _最近一次调用的最后一个):

在< module>中的第1行中输入< ipython-input-94-315fa8711f9d>
json_st ['results'] ['address_components']

TypeError:列表索引必须是整数或切片,而不是str

我得到预期的O / P的前3列,但无法提取其他列。
任何建议都是有帮助的

谢谢

Domnick

解决方案

我会去 json_normalize ,想到一个行的答案,但我不认为它可能ie (在这里,我只为px_val和py_val你可以做其他列的类似的东西)

  from pandas.io.json import json_normalize 

将pandas作为pd
导入json
$ b $以open('dat.json')作为f:
data = json.load(f)
$ b $ result = json_normalize(data,'results')

result ['px_val'] = result ['geometry']。apply(json_normalize).apply(lambda x: x ['location.lat'])
result ['py_val'] = result ['geometry']。apply(json_normalize).apply(lambda x:x ['location.lng'])

print(result [['formatted_address','px_val','py_val']])



 
formatted_address px_val py_val
0 Satya Niwas,Kanti Nagar,JB Nagar,Andheri E ... 19.109659 72.867471
1 82,Bamanpuri,Ajit Nagar,JB Nagar,Andheri ... 19.109749 72.867249
2 Todi Building ,Sheth Bhavanidas Benani Marg,K ... 19.109827 72.867789
3 KASI APARTMENTS,Shriniwas Bagarka Rd,Bamanpu ... 19.109334 72.867052
4银线公寓,Bamanpuri,JB Nagar,JB ... 19.109108 72.867078
5 Gokul panch chs,81-B,81-B,Sheth Bhavanidas ... 19.109871 72.867057
6 Ajit Nagar,JB Nagar,Andheri East,Mumbai,M ... 19.110316 72.868073
7 Bamanpuri,JB Nagar,Andheri东,孟买,马哈拉施特拉邦,... 19.108435 72.865749
8 JB Nagar,Andheri东,孟买,马哈拉施特拉4 ... 19.111062 72.865592
9 Andheri East,Mumbai,Maharashtra,印度19.115491 72.872695

我试图解析政治当然不会为这个解决方案感到骄傲,即

  pol = [] 
for result ['address_components']。apply(json_如果在'[types']中有'political',那么np.nan,1).dropna('normal'):
pol.append(','。join(i.apply(lambda x:x ['long_name' ()))

结果['political'] = pol

输出 result ['political']

 
0 Kanti Nagar,JB Nagar,Andheri East ,孟买,孟买...
1 Bamanpuri,Ajit Nagar,JB Nagar,Andheri East,Mu ...
2 Kanti Nagar,JB Nagar,Andheri East,Mumbai,Mumb ...
3 Bamanpuri,Kanti Nagar,JB Nagar,Andheri East,M ...
4 Bamanpuri,JB Nagar,JB Nagar,Andheri East,Mu ...
5 Bamanpuri,Ajit Nagar,JB Nagar,Andheri East,Mu ...
6 Ajit Nagar,JB Nagar,Andheri East,Mumbai,Mumba。 ..
7 Bamanpuri,JB Nagar,Andheri East,孟买,孟买...
8 JB Nagar,Andheri East,孟买,孟买Suburban,...
9 Andheri East,Mumbai,孟买Suburban,Maharashtr ...
名称:政治,dtype:对象

为了将它转换成一个方法,我们可以做

  def get_cols(st):
pol = []
for result ['address_components'] .apply(json_normalize):
pol.append(','。join(i.apply(lambda x:x ['long_name'] if st in x ['types'] else np.nan,1)。 dropna()))

返回pol

结果['political'] = get_cols('political')
#这将分配新的政治与数据。


I have a Json string from which I'm able to extract few components like formatted_address,lat,lng, but I'm unable to extract feature(values) of other components like intersection, political, country, administrative_area_level_1 , administrative_area_level_2 , administrative_area_level_3 , administrative_area_level_4, administrative_area_level_5, colloquial_area , locality , ward, neighborhood, premise, subpremise etc which is under long_name I'm expecting datatable like

formatted_address              px_val      py_val      political      country      administrative_area_level_1   ..  ..                 
Satya Niwas, Kanti Nagar..   19.1096591  72.8674712 Kanti Nagar,JB Nagar India   maharashtra   ..  ..                                                                 
82, Bamanpuri, Ajit Nagar..  19.109749   72.867249    Bamanpuri    India maharashtra   .. .. 
    .
    . 
    .

Here is the sample JSON string

{'results': [{'address_components': [{'long_name': 'Satya Niwas',
     'short_name': 'Satya Niwas',
     'types': ['establishment', 'point_of_interest', 'premise']},
    {'long_name': 'Kanti Nagar',
     'short_name': 'Kanti Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400059', 'short_name': '400059', 'types': ['postal_code']}],
   'formatted_address': 'Satya Niwas, Kanti Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400059, India',
   'geometry': {'bounds': {'northeast': {'lat': 19.1097923, 'lng': 72.8675306},
     'southwest': {'lat': 19.1095784, 'lng': 72.8673391}},
    'location': {'lat': 19.1096591, 'lng': 72.8674712},
    'location_type': 'ROOFTOP',
    'viewport': {'northeast': {'lat': 19.1110343302915,
      'lng': 72.8687838302915},
     'southwest': {'lat': 19.1083363697085, 'lng': 72.86608586970848}}},
   'place_id': 'ChIJ4UsP5DjI5zsR8hgwhHo9wEk',
   'types': ['establishment', 'point_of_interest', 'premise']},
  {'address_components': [{'long_name': '82',
     'short_name': '82',
     'types': ['premise']},
    {'long_name': 'Bamanpuri',
     'short_name': 'Bamanpuri',
     'types': ['neighborhood', 'political']},
    {'long_name': 'Ajit Nagar',
     'short_name': 'Ajit Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400053', 'short_name': '400053', 'types': ['postal_code']}],
   'formatted_address': '82, Bamanpuri, Ajit Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400053, India',
   'geometry': {'location': {'lat': 19.109749, 'lng': 72.867249},
    'location_type': 'ROOFTOP',
    'viewport': {'northeast': {'lat': 19.1110979802915,
      'lng': 72.8685979802915},
     'southwest': {'lat': 19.1084000197085, 'lng': 72.86590001970849}}},
   'place_id': 'ChIJqYip4zjI5zsR0Yg8bdXQX3o',
   'types': ['street_address']},
  {'address_components': [{'long_name': 'Todi Building',
     'short_name': 'Todi Building',
     'types': ['premise']},
    {'long_name': 'Sheth Bhavanidas Benani Marg',
     'short_name': 'Sheth Bhavanidas Benani Marg',
     'types': ['route']},
    {'long_name': 'Kanti Nagar',
     'short_name': 'Kanti Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400059', 'short_name': '400059', 'types': ['postal_code']}],
   'formatted_address': 'Todi Building, Sheth Bhavanidas Benani Marg, Kanti Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400059, India',
   'geometry': {'location': {'lat': 19.1098265, 'lng': 72.86778869999999},
    'location_type': 'ROOFTOP',
    'viewport': {'northeast': {'lat': 19.1111754802915,
      'lng': 72.86913768029149},
     'southwest': {'lat': 19.1084775197085, 'lng': 72.86643971970848}}},
   'place_id': 'ChIJo5bq3zjI5zsR2hRaNQF3xd0',
   'types': ['premise']},
  {'address_components': [{'long_name': 'KASI APARTMENTS',
     'short_name': 'KASI APARTMENTS',
     'types': ['establishment', 'point_of_interest', 'premise']},
    {'long_name': 'Shriniwas Bagarka Road',
     'short_name': 'Shriniwas Bagarka Rd',
     'types': ['route']},
    {'long_name': 'Bamanpuri',
     'short_name': 'Bamanpuri',
     'types': ['neighborhood', 'political']},
    {'long_name': 'Kanti Nagar',
     'short_name': 'Kanti Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400059', 'short_name': '400059', 'types': ['postal_code']}],
   'formatted_address': 'KASI APARTMENTS, Shriniwas Bagarka Rd, Bamanpuri, Kanti Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400059, India',
   'geometry': {'location': {'lat': 19.1093338, 'lng': 72.8670515},
    'location_type': 'ROOFTOP',
    'viewport': {'northeast': {'lat': 19.1106827802915,
      'lng': 72.86840048029151},
     'southwest': {'lat': 19.10798481970849, 'lng': 72.86570251970849}}},
   'place_id': 'ChIJoUz25DjI5zsRiMoiQtq5kXs',
   'types': ['establishment', 'point_of_interest', 'premise']},
  {'address_components': [{'long_name': 'Silver Line Apts.',
     'short_name': 'Silver Line Apts.',
     'types': ['premise']},
    {'long_name': 'Bamanpuri',
     'short_name': 'Bamanpuri',
     'types': ['neighborhood', 'political']},
    {'long_name': 'J.B. Nagar',
     'short_name': 'J.B. Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400047', 'short_name': '400047', 'types': ['postal_code']}],
   'formatted_address': 'Silver Line Apts., Bamanpuri, J.B. Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400047, India',
   'geometry': {'location': {'lat': 19.1091075, 'lng': 72.8670776},
    'location_type': 'ROOFTOP',
    'viewport': {'northeast': {'lat': 19.1104564802915,
      'lng': 72.86842658029151},
     'southwest': {'lat': 19.1077585197085, 'lng': 72.86572861970849}}},
   'place_id': 'ChIJEQ3_ZzjI5zsR9LxIP1h2b2c',
   'types': ['premise']},
  {'address_components': [{'long_name': 'Gokul panch chs',
     'short_name': 'Gokul panch chs',
     'types': ['establishment', 'point_of_interest']},
    {'long_name': '81-B', 'short_name': '81-B', 'types': ['street_number']},
    {'long_name': 'Sheth Bhavanidas Benani Marg',
     'short_name': 'Sheth Bhavanidas Benani Marg',
     'types': ['route']},
    {'long_name': 'Bamanpuri',
     'short_name': 'Bamanpuri',
     'types': ['neighborhood', 'political']},
    {'long_name': 'Ajit Nagar',
     'short_name': 'Ajit Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400047', 'short_name': '400047', 'types': ['postal_code']}],
   'formatted_address': 'Gokul panch chs, 81-B, 81-B, Sheth Bhavanidas Benani Marg, Bamanpuri, Ajit Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400047, India',
   'geometry': {'location': {'lat': 19.1098713, 'lng': 72.86705669999999},
    'location_type': 'ROOFTOP',
    'viewport': {'northeast': {'lat': 19.1112202802915,
      'lng': 72.8684056802915},
     'southwest': {'lat': 19.1085223197085, 'lng': 72.8657077197085}}},
   'place_id': 'ChIJpUuz4jjI5zsRpgQdmR5E1v0',
   'types': ['establishment', 'point_of_interest']},
  {'address_components': [{'long_name': 'Ajit Nagar',
     'short_name': 'Ajit Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_3']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400047', 'short_name': '400047', 'types': ['postal_code']}],
   'formatted_address': 'Ajit Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400047, India',
   'geometry': {'bounds': {'northeast': {'lat': 19.1119198, 'lng': 72.8714133},
     'southwest': {'lat': 19.1085396, 'lng': 72.8662167}},
    'location': {'lat': 19.1103164, 'lng': 72.8680732},
    'location_type': 'APPROXIMATE',
    'viewport': {'northeast': {'lat': 19.1119198, 'lng': 72.8714133},
     'southwest': {'lat': 19.1085396, 'lng': 72.8662167}}},
   'place_id': 'ChIJPWPg4zjI5zsRJWPFphEkcxc',
   'types': ['political', 'sublocality', 'sublocality_level_3']},
  {'address_components': [{'long_name': 'Bamanpuri',
     'short_name': 'Bamanpuri',
     'types': ['neighborhood', 'political']},
    {'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400047', 'short_name': '400047', 'types': ['postal_code']}],
   'formatted_address': 'Bamanpuri, J B Nagar, Andheri East, Mumbai, Maharashtra 400047, India',
   'geometry': {'bounds': {'northeast': {'lat': 19.1102874, 'lng': 72.869838},
     'southwest': {'lat': 19.1060651, 'lng': 72.8635609}},
    'location': {'lat': 19.1084347, 'lng': 72.86574929999999},
    'location_type': 'APPROXIMATE',
    'viewport': {'northeast': {'lat': 19.1102874, 'lng': 72.869838},
     'southwest': {'lat': 19.1060651, 'lng': 72.8635609}}},
   'place_id': 'ChIJIYgnUDjI5zsRK_Zl9Zy_QkY',
   'types': ['neighborhood', 'political']},
  {'address_components': [{'long_name': 'J B Nagar',
     'short_name': 'J B Nagar',
     'types': ['political', 'sublocality', 'sublocality_level_2']},
    {'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']},
    {'long_name': '400047', 'short_name': '400047', 'types': ['postal_code']}],
   'formatted_address': 'J B Nagar, Andheri East, Mumbai, Maharashtra 400047, India',
   'geometry': {'bounds': {'northeast': {'lat': 19.1161579, 'lng': 72.871533},
     'southwest': {'lat': 19.1008041, 'lng': 72.8606231}},
    'location': {'lat': 19.1110621, 'lng': 72.8655922},
    'location_type': 'APPROXIMATE',
    'viewport': {'northeast': {'lat': 19.1161579, 'lng': 72.871533},
     'southwest': {'lat': 19.1008041, 'lng': 72.8606231}}},
   'place_id': 'ChIJt8_u6TjI5zsRR9eE5rMK45A',
   'types': ['political', 'sublocality', 'sublocality_level_2']},
  {'address_components': [{'long_name': 'Andheri East',
     'short_name': 'Andheri East',
     'types': ['political', 'sublocality', 'sublocality_level_1']},
    {'long_name': 'Mumbai',
     'short_name': 'Mumbai',
     'types': ['locality', 'political']},
    {'long_name': 'Mumbai Suburban',
     'short_name': 'Mumbai Suburban',
     'types': ['administrative_area_level_2', 'political']},
    {'long_name': 'Maharashtra',
     'short_name': 'MH',
     'types': ['administrative_area_level_1', 'political']},
    {'long_name': 'India',
     'short_name': 'IN',
     'types': ['country', 'political']}],
   'formatted_address': 'Andheri East, Mumbai, Maharashtra, India',
   'geometry': {'bounds': {'northeast': {'lat': 19.1327276,
      'lng': 72.89305499999999},
     'southwest': {'lat': 19.096748, 'lng': 72.843926}},
    'location': {'lat': 19.1154908, 'lng': 72.8726952},
    'location_type': 'APPROXIMATE',
    'viewport': {'northeast': {'lat': 19.1327276, 'lng': 72.89305499999999},
     'southwest': {'lat': 19.096748, 'lng': 72.843926}}},
   'place_id': 'ChIJMbHfQRu25zsRMazdY3UpaKY',
   'types': ['political', 'sublocality', 'sublocality_level_1']}],
 'status': 'OK'}

Here is the snippet of code

    import json
    import pandas as pd
    line="json_str"
    json_st = json.loads(line)
    country=[]
    political=[]
    address_fields = { 
    'intersection': [],        
    'political': [],        
    'country': []
}

for json_str in json_st:
    address_fields = {

        'intersection': [],        
        'political': [],        
        'country': []
    }
    if isinstance(json_st,dict): 
         first_address_components = json_st['results']
         #format_add = json_st['results'][0]
    else:
         first_address_components = json_st[0]['address_components']
    for item in first_address_components:

        for field_key in address_fields.keys():
                #address_fields[field_key].append( str(format_add['formatted_address']))
              if field_key in item['types']:
               address_fields[field_key].append(item['long_name'])

    address_fields = {key: ', '.join(values) for key, values in address_fields.items()}
    country.append(address_fields['country'])   
    political.append(address_fields['political'])

It gives error

json_st['results']['address_components']
Traceback (most recent call last):

  File "<ipython-input-94-315fa8711f9d>", line 1, in <module>
    json_st['results']['address_components']

TypeError: list indices must be integers or slices, not str

I'm getting the first 3 columns of expected O/P but unable to extract other columns. Any suggestion on the same will be helpful

Thanks

Domnick

解决方案

I would go for json_normalize, thought of one line answer but I dont think its possible i.e (Here I did only for px_val and py_val you can do similar things for other columns)

from pandas.io.json import json_normalize

import pandas as pd
import json

with open('dat.json') as f:
    data = json.load(f)

result = json_normalize(data,'results')

result['px_val'] = result['geometry'].apply(json_normalize).apply(lambda x : x['location.lat'])
result['py_val'] = result['geometry'].apply(json_normalize).apply(lambda x : x['location.lng'])

print(result[['formatted_address','px_val','py_val']])

                              formatted_address        px_val      py_val
0  Satya Niwas, Kanti Nagar, J B Nagar, Andheri E...  19.109659  72.867471
1  82, Bamanpuri, Ajit Nagar, J B Nagar, Andheri ...  19.109749  72.867249
2  Todi Building, Sheth Bhavanidas Benani Marg, K...  19.109827  72.867789
3  KASI APARTMENTS, Shriniwas Bagarka Rd, Bamanpu...  19.109334  72.867052
4  Silver Line Apts., Bamanpuri, J.B. Nagar, J B ...  19.109108  72.867078
5  Gokul panch chs, 81-B, 81-B, Sheth Bhavanidas ...  19.109871  72.867057
6  Ajit Nagar, J B Nagar, Andheri East, Mumbai, M...  19.110316  72.868073
7  Bamanpuri, J B Nagar, Andheri East, Mumbai, Ma...  19.108435  72.865749
8  J B Nagar, Andheri East, Mumbai, Maharashtra 4...  19.111062  72.865592
9           Andheri East, Mumbai, Maharashtra, India  19.115491  72.872695

I try to parse political certainly not proud of this solution i.e

pol = []
for i in result['address_components'].apply(json_normalize):
     pol.append(','.join(i.apply(lambda x : x['long_name'] if 'political' in x['types'] else np.nan,1).dropna()))

result['political'] = pol

Output result['political']

0    Kanti Nagar,J B Nagar,Andheri East,Mumbai,Mumb...
1    Bamanpuri,Ajit Nagar,J B Nagar,Andheri East,Mu...
2    Kanti Nagar,J B Nagar,Andheri East,Mumbai,Mumb...
3    Bamanpuri,Kanti Nagar,J B Nagar,Andheri East,M...
4    Bamanpuri,J.B. Nagar,J B Nagar,Andheri East,Mu...
5    Bamanpuri,Ajit Nagar,J B Nagar,Andheri East,Mu...
6    Ajit Nagar,J B Nagar,Andheri East,Mumbai,Mumba...
7    Bamanpuri,J B Nagar,Andheri East,Mumbai,Mumbai...
8    J B Nagar,Andheri East,Mumbai,Mumbai Suburban,...
9    Andheri East,Mumbai,Mumbai Suburban,Maharashtr...
Name: political, dtype: object

To convert it to a method we can do

def get_cols(st):
    pol = []
    for i in result['address_components'].apply(json_normalize):
         pol.append(','.join(i.apply(lambda x : x['long_name'] if st in x['types'] else np.nan,1).dropna()))

   return  pol

result['political'] = get_cols('political') 
# This will assign the new column political with data. 

这篇关于Python从Json字符串中提取元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆