通过查看另一个数据框的列获取数据框的对应列

问题描述 投票:0回答:2

我有两个用于地面真实性和预测轨迹的数据帧,一个用于在地面真实性和预测轨迹之间进行匹配的数据帧。我有groundtruth轨迹和预测轨迹的数据框,如下所示:

df_pred_batch = 
             CENTER_X  CENTER_Y  LENGTH  SPEED  ACCELERATION  HEADING
FrameId HId                                                           
0       0   -1.870000     -0.41    1.51  1.280         1.670     0.39
1       0   -1.730000     -0.36    1.51  1.440         1.660     0.40
2       0   -1.180000     -1.57    2.05  2.220         0.390     0.61
0       1   -1.540000     -1.83    2.05  2.140         0.390     0.61
1       1   -1.370000     -1.70    2.05  2.180         0.390     0.61
2       1   -1.590000     -0.29    1.51  1.610         1.630     0.41
1       2   -1.910000     -1.12    1.04  0.870         1.440     0.30
2       2   -1.810000     -1.09    1.04  1.010         1.440     0.27
0       3   17.190001     -3.15    1.80  2.178        -0.028     3.36
1       3   15.000000     -3.60    1.80  2.170        -0.020     3.38
df_gt_batch = 
            CENTER_X  CENTER_Y  LENGTH  SPEED  ACCELERATION  HEADING
FrameId OId                                                          
1       0      -1.91     -1.12   1.040   0.87          1.44     0.30
2       0      -1.81     -1.09   1.040   1.01          1.44     0.27
0       1      -1.87     -0.41   1.510   1.28          1.67     0.39
1       1      -1.73     -0.36   1.510   1.44          1.66     0.40
2       1      -1.59     -0.29   1.510   1.61          1.63     0.41
0       2      -1.54     -1.83   2.056   2.14          0.39     0.61
1       2      -1.37     -1.70   2.050   2.18          0.39     0.61
2       2      -1.18     -1.57   2.050   2.22          0.39     0.61
0       3       1.71     -0.31   1.800   2.17         -0.02     3.36
1       3       1.50     -0.36   1.800   2.17         -0.02     3.38
2       3       1.29     -0.41   1.800   2.17         -0.01     3.40

而且,我知道它们在每个时间戳上都匹配:

matched_gt_pred = 
   FrameId   Type  OId  HId
0        0  MATCH  1.0  0.0
1        0  MATCH  2.0  1.0
4        1  MATCH  1.0  0.0
5        1  MATCH  2.0  1.0
6        1  MATCH  0.0  2.0
9        2  MATCH  0.0  2.0

我想查看matched_gt_pred的每一行,并从df_pred_batch和df_gt_batch获取相应的CENTER_X并计算错误。例如,看matched_gt_pred的第一行,我在FrameId == 0知道,并且OId == 1HId == 0是匹配的。我应该从Center_X中获取gt_center_x = df_gt_batch["FrameId==0" and "OId == 1"].CENTER_X and pred_center_x = df_pred_batch["FrameId==0" and "HId == 0"].CENTER_X并计算error = abs(gt_center_x - pred_center_x)

pandas dataframe slice
2个回答
0
投票

IIUC,我将重塑您的df_gt_batch和df_pred_batch并使用查找:

gt_x = df_gt_batch['Center_X'].unstack().lookup(match_gt_pred['FrameId'], match_gt_pred['OId']) 
pred_x = df_pred_batch['Center_X'].unstack().lookup(match_gt_pred['FrameId'], match_gt_pred['HId'])
match_gt_pred['X Error'] = np.abs(gt_x - pred_x)

输出:

   FrameId   Type  OId  HId  X Error
0        0  MATCH  1.0  0.0      0.0
1        0  MATCH  2.0  1.0      0.0
4        1  MATCH  1.0  0.0      0.0
5        1  MATCH  2.0  1.0      0.0
6        1  MATCH  0.0  2.0      0.0
9        2  MATCH  0.0  2.0      0.0

另一种选择是将reindexpd.MultiIndex一起使用:

match_gt_pred['X Error'] = (df_pred_batch.reindex(pd.MultiIndex.from_arrays([match_gt_pred['FrameId'], match_gt_pred['HId']]))['Center_X'].to_numpy() - 
df_gt_batch.reindex(pd.MultiIndex.from_arrays([match_gt_pred['FrameId'], match_gt_pred['OId']]))['Center_X'].to_numpy())

0
投票

假设您的OId和HId是整数

def get_error(row):
    OId = row['OId']
    HId = row['HId']
    FId = row['FrameId']

    gt_x = df_gt_batch.query('FrameID == @FId and FrameID == @OId')
    pred_x = df_pred_batch.query('FrameID == @FId and HId == @HId')
    return np.abs(gt_x - pred_x)

match_gt_pred['X Error'] = match_gt_pred.apply(get_error, axis=1)

在每行(apply)上使用axis = 1,您一定会以正确的顺序获取它。

请注意,您可以直接使用以下调用来调用索引:query(我没有测试过),而不是使用gt_x = df_gt_batch.loc[(FId,OId)]方法。参见https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html#advanced-indexing-with-hierarchical-index

© www.soinside.com 2019 - 2024. All rights reserved.