我需要一些帮助在python中创建轨迹。我有一个包含user_ids,时间戳,纬度和经度的CSV。我想在我的文件中创建第5列(或者一起写入新文件),其中包含每个user_id的轨迹,这需要按用户对坐标进行分组,并按时间戳排序(升序)。我能够在PostGIS中完成,但结果是几何,我需要的是坐标系。我已经尝试过使用集合和itertools以及Pandas来进行分组和排序,但我正在努力。
供参考,以下是我的数据行:
user_id, timestamp, latitude, longitude
478134225, 3/12/2017 9:04, 38.8940974, -77.0276216
478103585, 3/12/2017 9:04, 38.882584, -77.1124701
478073193, 3/12/2017 9:07, 39.00027849, -77.09480086
476194185, 3/12/2017 9:14, 38.8048355, -77.0469214
476162349, 3/12/2017 9:16, 38.8940974, -77.0276216
478073193, 3/12/2017 9:05, 38.8549, -76.8752
477899275, 3/12/2017 9:08, 38.90181532, -77.03733586
477452890, 3/12/2017 9:08, 38.96117237, -76.95561893
478073193, 3/12/2017 9:05, 38.7188716, -77.1542684
正如您所看到的,有些用户有多个条目,所以我需要按他们分组并按时间排序坐标。例如。类似于下面的东西
478073193 (38.8549,-76.8752)(38.7188716,-77.1542684)(39.00027849,-77.09480086)
我有超过150k的积分,所以像我上面那样手工做是不可取的。
答案 0 :(得分:2)
这应该这样做。它使用流行的熊猫包和numpy。
import pandas as pd
import numpy as np
# First we import the data
data = pd.read_csv('data.csv', delimiter=', ')
# Now get a list of unique user_id values
uniqueIds = np.unique(data['user_id'].values)
# Now just get the ordered (by timestamp) coordinates for each user_id
output = [[id,data.loc[data['user_id']==id].sort_values(by='timestamp')[['latitude','longitude']].values.tolist()] for id in uniqueIds]
输出是一个列表,其中包含[id,list_of_paired_coordinates]形式的每个元素,例如:
[[476162349, [[38.8940974, -77.02762159999999]]],
[478073193, [[38.8549, -76.8752],
[38.7188716, -77.1542684],
[39.00027849, -77.09480086]]],
[478103585, [[38.882584, -77.11247009999998]]],
[478134225, [[38.8940974, -77.02762159999999]]]]
如果您想以JSON格式保存输出,可以执行以下操作:
import json
# Now turn our array into a dict {id:coordinates}
outputDict = {}
for i in output:
outputDict[i[0]]=i[1]
with open('output.json', 'w') as f:
json.dump(outputDict, f, sort_keys=True, indent=4, ensure_ascii=False, separators=(',',':'))
根据您对输出文件格式的格式化,您可能需要稍微修改 outputDict 的结构(如果是这种情况,请告诉我)。现在JSON文件看起来像:
{
"476162349":[
[
38.8940974,
-77.02762159999999
]
],
"476194185":[
[
38.804835499999996,
-77.0469214
]
....
如果要格式化输出JSON文件,可以为dict中存储的值添加标签:
outputDict = {}
for i in output:
coords={}
latList=[]
longList=[]
for j in i[1]:
latList.append(j[0])
longList.append(j[1])
coords["latitude"]=latList
coords["longitude"]=longList
outputDict[i[0]]=coords
输出JSON文件看起来像这样:
{
"476162349":{
"latitude":[
38.8940974
],
"longitude":[
-77.02762159999999
]
},
"476194185":{
"latitude":[
38.804835499999996
],
"longitude":[
-77.0469214
]
}
....