将数据帧值与聚合数据帧进行比较

时间:2021-01-30 04:49:40

标签: python pandas dataframe

我有一个名为 allData 的数据框,其中包含与数千个 x、y、z 轨迹数据文件有关的数千行试验信息/数据。

每行包含:

  1. obsScenario:0、1 或 2
  2. startPos:1 或 2
  3. 目标位置:1、2 或 3
  4. cumDist:该轨迹累计行驶距离的 float64 值

对于每个 obsScenario,有 2 个起始位置和 3 个目标位置,因此每个障碍场景有 6 次试验(1 X 2 X 3)。

allData 看起来像这样:

    obsScenario  startPos  targetPos    cumDist
0            0         1          1  33.797209
1            2         1          1  34.941458
2            2         1          2  34.153108
3            2         2          1  37.489698
4            0         1          1  35.099954
5            0         1          3  37.368709
6            2         1          1  33.421624
7            0         1          2  32.491703
8            1         2          1  37.268338
9            2         2          2  34.414690
...

我创建了第二个数据帧 allData_avg 来获取平均累积距离,使用以下方法按变量 1-3(obsScenario、startPos、targetPos)分组:

allData_avg = allData.groupby(['obsScenario', 'startPos', 'targetPos']).agg([np.average])

allData_avg 看起来像这样:

                                  cumDist
                                  average
obsScenario startPos targetPos           
0           1        1          34.236374
                     2          33.360685
                     3          40.131592
            2        1          39.493517
                     2          34.034068
                     3          34.835779
1           1        1          34.290811
                     2          34.100946
                     3          39.116431
            2        1          38.641681

我现在尝试使用这些平均值从 allData 中过滤掉累积距离比与该试验的 obsScenario、startPos 和 targetPos 值的特定组合有关的平均值大/大 1.25 倍的轨迹(这是为了过滤掉奇怪/糟糕的参与者轨迹)。

例如,对于 allData 的索引 5,cumDist 37.37 需要 < 1.25 * 40.13。如果不是,则应从原始数据帧 allData 中删除整行数据。

我已经尝试这样做了一段时间,但被难住了。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

import pandas as pd
import numpy as np

df=pd.read_excel(r"D:\Stack_overflow\test10.xlsx")


df['avg_cum']=df.groupby(['obsScenario', 'startPos', 'targetPos'])['cumDist'].transform('mean') #ADDING AVERAGE OF CUMDIST COLUMN BASED ON THE COMBINATION

df.loc[df['cumDist'] < df['avg_cum']*1.25] #FILTER BASED ON THE VALUE

这就是我们如何根据新添加的累积列过滤掉值。 我不确定关于值 40.13 你是如何实现的,可能它是所有数据的平均值,而我已经对问题中列出的前 9-10 行执行了操作。

希望能解决问题。

答案 1 :(得分:1)

这不会是最优化的解决方案,但可以让您了解如何去做。

rows_to_be_deleted = []

for i, row in allData.iterrows():

    obsScenario = row['obsScenario']
    startPos = row['startPos']
    targetPos = row['targetPos']

    cumDistAvg = allData_avg.loc[obsScenario].loc[startPos].loc[targetPos]['cumDist'].loc['average']

    if row['cumDist'] >= (1.25 * cumDistAvg):
        rows_to_be_deleted.append(i)

allData_filtered = allData.drop(rows_to_be_deleted)
相关问题