Python extract elements from Json string

前端 未结 3 663
小蘑菇
小蘑菇 2021-01-28 01:42

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(val

3条回答
  •  野性不改
    2021-01-28 02:20

    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. 
    

提交回复
热议问题