我目前正在努力从 json 中提取“point”字段的纬度和经度值。我想将每个字段值存储在两个新列中。pandas dataframe中的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>
我的代码哪里不正确?
谢谢
仅使用函数名称:
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)
我是一名优秀的程序员,十分优秀!