如何在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的行。
你的代码存在的问题
- 时间类型未转换:直接用字符串格式的
Time列相减会报错,必须先转为datetime类型,还要结合Date列避免跨天计算错误。 - 循环越界问题:用
df.iloc[i+1]遍历到最后一行时,会超出索引范围。 - drop方法使用错误:
distances.drop([row])没有指定轴,且Pandas对象是不可变类型,需要重新赋值或用inplace=True才会生效。 - 条件逻辑错误:第一个函数里的
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
相关产品推荐
相关产品推荐

