【问题标题】:get corresponding column of a dataframe by looking at columns of another dataframe通过查看另一个数据框的列来获取数据框的相应列
【发布时间】:2020-09-06 01:31:57
【问题描述】:

我有两个用于groundtruth 和预测轨迹的数据框,以及一个用于在每一帧的groundtruth 和预测轨迹之间进行匹配的数据框。 我有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 == 0OId == 1HId == 0 是匹配的。 我应该从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 得到Center_X 并计算error = abs(gt_center_x - pred_center_x)

【问题讨论】:

    标签: pandas dataframe slice


    【解决方案1】:

    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())
    

    【讨论】:

    • 这看起来很复杂。两者都是索引表,索引在matched_gt_pred 中。我建议使用df.query 方法。
    • @Wli 你能发布你的df.query 方法吗?谢谢!
    【解决方案2】:

    假设你的 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

    【讨论】:

    • 这是一个非常慢的方法。您正在逐行迭代。不建议将applyaxis=1 一起使用。
    • 很高兴知道,我认为它会足够有效,因为结果彼此独立。我猜使用raw=True 可以提高效率,必须进行测试...lookup 是不是更快?
    猜你喜欢
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多