我有一个名为 allData 的数据框,其中包含与数千个 x、y、z 轨迹数据文件有关的数千行试验信息/数据。
每行包含:
对于每个 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 中删除整行数据。
我已经尝试这样做了一段时间,但被难住了。非常感谢任何帮助。
答案 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)