如何在python 3中获得经度和经度字段JSON的特定值?

时间:2017-11-06 11:23:50

标签: python json python-3.x pandas

我目前正致力于从json中提取“点”字段的纬度和经度值。我想将每个字段值存储在两个新列中。 pandas数据框中的JSON如下:

    user_id                     timestamp   point
0   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486}
1   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486}
2   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486}
3   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486}
4   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486}

我尝试了以下功能并且有效:

row = test["point"][0]

type(row)

row["lat"]

但是现在我想用另一个函数提取,我得到了新的列:

<function getLat at 0x0000000006AE2950>

<function getLon at 0x0000000006A58BF8>

功能是:

def getLat(point):
   return point["lat"]

def getLon(point):
   return point["lon"]

test["lat"] = test["point"].apply(lambda row: getLat)

test["lon"] = test["point"].apply(lambda row: getLon)

我得到下表:

    user_id                     timestamp   point                   lat  lon
0   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486} <function getLat at 0x0000000006AE2950> <function getLon at 0x0000000006A58BF8>
1   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486} <function getLat at 0x0000000006AE2950> <function getLon at 0x0000000006A58BF8>
2   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486} <function getLat at 0x0000000006AE2950> <function getLon at 0x0000000006A58BF8>
3   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486} <function getLat at 0x0000000006AE2950> <function getLon at 0x0000000006A58BF8>
4   58d3ac2de04bd5249b4f6600    14567410    {'lon': 2.9546, 'lat': 41.5486} <function getLat at 0x0000000006AE2950> <function getLon at 0x0000000006A58BF8>

我的代码在哪里不正确?

由于

1 个答案:

答案 0 :(得分:1)

仅使用功能名称:

test["lat"] = test["point"].apply(getLat)

就像:

test["lat"] = test["point"].apply(lambda x: getLat(x))

或仅使用lambda函数:

test["lat"] = test["point"].apply(lambda x: x["lat"])
print (test)
                    user_id  timestamp                            point  \
0  58d3ac2de04bd5249b4f6600   14567410  {'lat': 41.5486, 'lon': 2.9546}   
1  58d3ac2de04bd5249b4f6600   14567410  {'lat': 41.5486, 'lon': 2.9546}   
2  58d3ac2de04bd5249b4f6600   14567410  {'lat': 41.5486, 'lon': 2.9546}   
3  58d3ac2de04bd5249b4f6600   14567410  {'lat': 41.5486, 'lon': 2.9546}   
4  58d3ac2de04bd5249b4f6600   14567410  {'lat': 41.5486, 'lon': 2.9546}   

       lat  
0  41.5486  
1  41.5486  
2  41.5486  
3  41.5486  
4  41.5486  

使用DataFrame构造函数的解决方案,pop删除原始DataFrame中的列,join用于附加到原始文件:

test = test.join(pd.DataFrame(test.pop('point').values.tolist(), index=test.index))
print (test)
                    user_id  timestamp      lat     lon
0  58d3ac2de04bd5249b4f6600   14567410  41.5486  2.9546
1  58d3ac2de04bd5249b4f6600   14567410  41.5486  2.9546
2  58d3ac2de04bd5249b4f6600   14567410  41.5486  2.9546
3  58d3ac2de04bd5249b4f6600   14567410  41.5486  2.9546
4  58d3ac2de04bd5249b4f6600   14567410  41.5486  2.9546

另一个想法是使用json_normalize

from pandas.io.json import json_normalize 
import json

with open('file.json') as data_file:    
    d = json.load(data_file)

df = json_normalize(d)
print (df)