下面我有一个 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) 显示先前访问过的地点 (prior_lat, prior_lon) 的 GPS 坐标。如果没有 place 的先前位置,它将是它自己(即 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
这只是我程序的一小部分,但我很难展示完整的代码。也许有一种简单的方法可以在我的程序末尾添加最后两列?
最佳答案
您可以使用 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']])
关于python - Pandas——将值从一列映射到另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51705595/