You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中创建函数按预定义参数删除DataFrame异常行?

鱼类游动数据异常值过滤实现方案

数据与需求说明

你的原始数据如下:

StartPosition           FinishPosition      PathDistance        Time           Date
(27777.9, 1944.72)    (2783.63, 1941.08)        6.72            13:28:15.56    2023-07-08
(2783.63, 1941.08)    (2790.62, 1939.07)        3.22            14:12:19.52    2023-07-08
(2790.62, 1939.07)    (2778.02, 1946.28)        5.14            14:55:17.23    2023-07-08
(2778.02, 1946.28)    (2783.53, 1943.08)        7.60            15:33:47.27    2023-07-08
(2783.53, 1943.08)    (2792.62, 1963.25)        80.21           15:59:23.51    2023-07-08
(2792.62, 1963.25)    (2785.83, 1947.77)        2.96            16:31:12.14    2023-07-08
(2785.83, 1947.77)    (2756.21, 1933.54)        5.29            18:29:13.35    2023-07-08
(2756.21, 1933.54)    (2784.73, 1996.91)        105.32          19:01:45.35    2023-07-08

需求:删除连续两点时间间隔<15分钟且PathDistance>50的行。

你的代码存在的问题

  1. 时间类型未转换:直接用字符串格式的Time列相减会报错,必须先转为datetime类型,还要结合Date列避免跨天计算错误。
  2. 循环越界问题:用df.iloc[i+1]遍历到最后一行时,会超出索引范围。
  3. drop方法使用错误:distances.drop([row])没有指定轴,且Pandas对象是不可变类型,需要重新赋值或用inplace=True才会生效。
  4. 条件逻辑错误:第一个函数里的if(IntervalTime > 15, PathDistance < 50)写法不符合Python语法,逻辑也未匹配需求。

正确实现步骤与代码

步骤1:转换时间格式(合并Date和Time)

先把Date和Time合并成完整的datetime列,确保时间差计算准确:

import pandas as pd

# 假设你的DataFrame名为df
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

步骤2:计算连续行的时间间隔(分钟)

用shift()获取下一行的时间,计算时间差并转为分钟数:

# 计算当前行到下一行的时间间隔(分钟)
df['TimeInterval'] = (df['Datetime'].shift(-1) - df['Datetime']).dt.total_seconds() / 60

步骤3:筛选保留符合条件的行

生成布尔掩码,保留时间间隔>=15分钟或PathDistance<=50的行;最后一行因为没有下一行,直接保留:

# 生成掩码:满足保留条件的行标记为True
mask = (df['TimeInterval'] >= 15) | (df['PathDistance'] <= 50)
# 最后一行无后续数据,直接保留
mask.iloc[-1] = True

# 过滤后的DataFrame,清理临时列
filtered_df = df[mask].drop(columns=['Datetime', 'TimeInterval'])

完整代码

import pandas as pd

# 构造你的DataFrame(如果已有可跳过)
data = {
    'StartPosition': ['(27777.9, 1944.72)', '(2783.63, 1941.08)', '(2790.62, 1939.07)', '(2778.02, 1946.28)', '(2783.53, 1943.08)', '(2792.62, 1963.25)', '(2785.83, 1947.77)', '(2756.21, 1933.54)'],
    'FinishPosition': ['(2783.63, 1941.08)', '(2790.62, 1939.07)', '(2778.02, 1946.28)', '(2783.53, 1943.08)', '(2792.62, 1963.25)', '(2785.83, 1947.77)', '(2756.21, 1933.54)', '(2784.73, 1996.91)'],
    'PathDistance': [6.72, 3.22, 5.14, 7.60, 80.21, 2.96, 5.29, 105.32],
    'Time': ['13:28:15.56', '14:12:19.52', '14:55:17.23', '15:33:47.27', '15:59:23.51', '16:31:12.14', '18:29:13.35', '19:01:45.35'],
    'Date': ['2023-07-08']*8
}
df = pd.DataFrame(data)

# 1. 合并日期和时间为datetime格式
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 2. 计算到下一行的时间间隔(分钟)
df['TimeInterval'] = (df['Datetime'].shift(-1) - df['Datetime']).dt.total_seconds() / 60

# 3. 生成过滤掩码
mask = (df['TimeInterval'] >= 15) | (df['PathDistance'] <= 50)
mask.iloc[-1] = True  # 最后一行无后续数据,直接保留

# 4. 过滤并清理临时列
filtered_df = df[mask].drop(columns=['Datetime', 'TimeInterval'])

print(filtered_df)

内容的提问来源于stack exchange,提问作者toms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:02:52