python - Pandas——将值从一列映射到另一列
问题描述
下面我有一个 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
现在我正在尝试添加另外两列来显示之前访问过的地方的 GPS 坐标(prior_lat,prior_lon),根据列(Pos_in_route)。如果没有先前的位置位置,它将是它自己(即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 - 过滤掉与另一个列表匹配的列表元素并保留原始列表顺序
- birt - 如何将 OdadataSourceHandle 从一个设计报告复制到另一个设计报告?
- azure-machine-learning-studio - Azure 机器学习 (AML) 如何确定输入在训练数据中的“类型”,因为这会导致错误
- javascript - 拖放时附加到 d3 js 树的 jquery 对话框
- javascript - 类型错误:道具未定义
- angular - angularjs 英雄之旅示例,如何实现 web API Server
- sql - 在sql中将字母转换为数字
- javascript - 用于直接呼叫 Skype for Business 的 JavaScript 超链接
- javascript - 在作为道具传递的 vue 组件中使用模板
- java - 使用大量测试步骤编写测试用例脚本时如何在eclipse中调试selenium java代码