下面我有一个DataFrame,显示每个车辆(Vehicle_ID)如何以特定顺序(Pos_in_route)访问不同的地点(place_id)。
place_id Lat Lon Vehicle_ID Pos_in_route
0 51.4457678 -0.45613 0 0
1 52.497911 -1.903832 0 1
2 52.332395 -1.346753 0 2
0 51.4457678 -0.45613 0 3
0 51.4457678 -0.45613 1 0
4 52.110728 -0.463547 1 1
3 52.276323 -1.579845 1 2
5 52.423667 -0.609697 1 3
0 51.4457678 -0.45613 1 4
现在,根据列(Pos_in_route),我尝试添加另外两列以显示先前访问过的地方的GPS坐标(prior_lat,prior_lon)。如果没有位置的先前位置,它将是它本身(即place_id = 0)
place_id Lat Lon Vehicle_ID Pos_in_route prior_lat prior_lon
0 51.4457678 -0.45613 0 0 51.4457678 -0.45613
1 52.497911 -1.903832 0 1 51.4457678 -0.45613
2 52.332395 -1.346753 0 2 52.497911 -1.903832
0 51.4457678 -0.45613 0 3 52.332395 -1.346753
0 51.4457678 -0.45613 1 0 51.4457678 -0.45613
4 52.110728 -0.463547 1 1 51.4457678 -0.45613
3 52.276323 -1.579845 1 2 52.110728 -0.463547
5 52.423667 -0.609697 1 3 52.276323 -1.579845
0 51.4457678 -0.45613 1 4 52.423667 -0.609697
这只是我程序的一小部分,但是我很难显示完整的代码。也许有一种简单的方法可以在程序末尾添加最后两列?
答案 0 :(得分:4)
您可以先使用GroupBy
+ shift
,然后再使用bfill
:
g = df.groupby('Vehicle_ID')
df[['Prior_Lat', 'Prior_Lon']] = g[['Lat', 'Lon']].shift().bfill()
print(df[['Prior_Lat', 'Prior_Lon']])
Prior_Lat Prior_Lon
0 51.445768 -0.456130
1 51.445768 -0.456130
2 52.497911 -1.903832
3 52.332395 -1.346753
4 51.445768 -0.456130
5 51.445768 -0.456130
6 52.110728 -0.463547
7 52.276323 -1.579845
8 52.423667 -0.609697
或者,您可以使用fillna
代替bfill
:
df[['Prior_Lat', 'Prior_Lon']] = g[['Lat', 'Lon']].shift().fillna(df[['Lat', 'Lon']])
答案 1 :(得分:-1)
按如下所述使用merge_asof
,
df = pd.DataFrame(
{
'Vechile_ID': [0] * 4 + [1] * 4,
'Pos_in_route': list(range(0, 4)) * 2,
'lat': [1, 3, 1, 2, 4, 2, 1, 2]
}
)
df = df.sort_values('Pos_in_route')
df = pd.merge_asof(
df, df, by='Vechile_ID', on='Pos_in_route',
allow_exact_matches=False, suffixes=('', '_prior')
)
df = df.sort_values(['Vechile_ID', 'Pos_in_route']).bfill()
这会将整个数据框重新连接到自身上,但是为了使Pos_in_route
列的相等实例未连接,将连接下一个可用实例。
要完成此操作,您需要删除不需要的prior
列。