Pandas将值从一列映射到另一列

2024-10-01 22:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

下面我有一个数据框,显示了每辆车(车号)将如何按照特定的顺序访问不同的地点(地点编号)(在路线中的位置)。在

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坐标。如果没有地点的先前位置,它将是它自己(即地点_id=0)

^{pr2}$

这是我程序的一小部分,但我很难展示完整的代码。也许有一种简单的方法可以在我的程序末尾添加最后两列?在


Tags: 数据inpos程序id顺序place路线
2条回答

您可以使用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

^{pr2}$

使用^{}如下:

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列。在

相关问题 更多 >

    热门问题