python - Pandas——将值从一列映射到另一列

标签 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

现在我尝试添加另外两列以根据列 (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/

相关文章:

python - pandas - 将一列复制到另一列而不有效覆盖

python - 多索引数据帧的每一行的减法表(差异)

python - 带有 python 2 的 Ubuntu

python - 绑定(bind)按键

python - 将值添加到数据框的所有行

python - 检查角度是否落入圆形置信区间的优雅(最有效)方法

python - 使用实际数据在图上添加回归线

python - 如何读取字典行并写入 CSV 文件

Python - 返回具有唯一键 :Value pair 的字典列表

pandas - DataFrame 单元格换行符