使用应用动态条件的循环过滤 Pandas DataFrame
Filter Pandas DataFrame using a loop that is applying a dynamic conditional
我有一个包含两列的数据框。
一列显示距离,另一列包含与一组距离关联的唯一 'trackIds'。
示例:
trackId. distance
2. 17.452
2. 8.650
2. 10.392
2. 11.667
2. 23.551
2. 9.881
3. 6.052
3. 7.241
3. 8.459
3. 22.644
3. 126.890
3. 12.442
3. 5.891
4. 44.781
4. 7.657
4. 36.781
4. 224.001
我想做的是消除任何包含距离大峰值的 trackIds -- 大于 75 的峰值。
在这个示例中,轨道 ID 3 和 4(及其所有相关距离)将从数据帧中删除,因为我们看到距离大于 75 的尖峰,因此我们只剩下一个包含轨道 ID 2 及其所有相关联的数据帧距离值。
这是我的代码:
i = 0
k = 1
length = len(dataframe)
while i < length:
if (dataframe.distance[k] - dataframe.distance[i]) > 75:
bad_id = dataframe.trackId[k]
condition = dataframe.trackid != bad_id
df2 = dataframe[condition]
i+=1
我尝试使用能够遍历所有不同 trackId 的 while 循环,减去所有距离值并查看结果是否 > 75,如果是,则程序将该 trackId 与变量相关联'bad_id' 并将其用作过滤数据帧的条件,以仅包含不等于 bad_id(s) 的 trackId。
我一直收到 nameErrors,因为我不确定如何正确构建循环,而且我通常不确定这种方法是否有效。
我们可以使用diff
to compute the difference between each row, then use groupby transform
to check if there are any differences in the group gt
75。然后保留组,其中没有任何匹配项:
m = ~(df['distance'].diff().gt(75).groupby(df['trackId']).transform('any'))
filtered_df = df.loc[m, df.columns]
filtered_df
:
trackId distance
0 2.0 17.452
1 2.0 8.650
2 2.0 10.392
3 2.0 11.667
4 2.0 23.551
5 2.0 9.881
作为 DataFrame 的步骤分解:
breakdown = pd.DataFrame({'diff': df['distance'].diff()})
breakdown['gt 75'] = breakdown['diff'].gt(75)
breakdown['groupby any'] = (
breakdown['gt 75'].groupby(df['trackId']).transform('any')
)
breakdown['negation'] = ~breakdown['groupby any']
print(breakdown)
breakdown
:
diff gt 75 groupby any negation
0 NaN False False True
1 -8.802 False False True
2 1.742 False False True
3 1.275 False False True
4 11.884 False False True
5 -13.670 False False True
6 -3.829 False True False
7 1.189 False True False
8 1.218 False True False
9 14.185 False True False
10 104.246 True True False # Spike of more than 75
11 -114.448 False True False
12 -6.551 False True False
13 38.890 False True False
14 -37.124 False True False
15 29.124 False True False
16 187.220 True True False # Spike of more than 75
我有一个包含两列的数据框。 一列显示距离,另一列包含与一组距离关联的唯一 'trackIds'。
示例:
trackId. distance
2. 17.452
2. 8.650
2. 10.392
2. 11.667
2. 23.551
2. 9.881
3. 6.052
3. 7.241
3. 8.459
3. 22.644
3. 126.890
3. 12.442
3. 5.891
4. 44.781
4. 7.657
4. 36.781
4. 224.001
我想做的是消除任何包含距离大峰值的 trackIds -- 大于 75 的峰值。 在这个示例中,轨道 ID 3 和 4(及其所有相关距离)将从数据帧中删除,因为我们看到距离大于 75 的尖峰,因此我们只剩下一个包含轨道 ID 2 及其所有相关联的数据帧距离值。
这是我的代码:
i = 0
k = 1
length = len(dataframe)
while i < length:
if (dataframe.distance[k] - dataframe.distance[i]) > 75:
bad_id = dataframe.trackId[k]
condition = dataframe.trackid != bad_id
df2 = dataframe[condition]
i+=1
我尝试使用能够遍历所有不同 trackId 的 while 循环,减去所有距离值并查看结果是否 > 75,如果是,则程序将该 trackId 与变量相关联'bad_id' 并将其用作过滤数据帧的条件,以仅包含不等于 bad_id(s) 的 trackId。
我一直收到 nameErrors,因为我不确定如何正确构建循环,而且我通常不确定这种方法是否有效。
我们可以使用diff
to compute the difference between each row, then use groupby transform
to check if there are any differences in the group gt
75。然后保留组,其中没有任何匹配项:
m = ~(df['distance'].diff().gt(75).groupby(df['trackId']).transform('any'))
filtered_df = df.loc[m, df.columns]
filtered_df
:
trackId distance
0 2.0 17.452
1 2.0 8.650
2 2.0 10.392
3 2.0 11.667
4 2.0 23.551
5 2.0 9.881
作为 DataFrame 的步骤分解:
breakdown = pd.DataFrame({'diff': df['distance'].diff()})
breakdown['gt 75'] = breakdown['diff'].gt(75)
breakdown['groupby any'] = (
breakdown['gt 75'].groupby(df['trackId']).transform('any')
)
breakdown['negation'] = ~breakdown['groupby any']
print(breakdown)
breakdown
:
diff gt 75 groupby any negation
0 NaN False False True
1 -8.802 False False True
2 1.742 False False True
3 1.275 False False True
4 11.884 False False True
5 -13.670 False False True
6 -3.829 False True False
7 1.189 False True False
8 1.218 False True False
9 14.185 False True False
10 104.246 True True False # Spike of more than 75
11 -114.448 False True False
12 -6.551 False True False
13 38.890 False True False
14 -37.124 False True False
15 29.124 False True False
16 187.220 True True False # Spike of more than 75