Pandas DataFrame迭代处理:删除freq值小于前一行的异常数据行
实现方案
你可以直接用Pandas的向量化操作实现需求,不需要手动遍历全表,代码简洁且执行效率更高,完全可以满足你3700行数据的处理需求。
核心逻辑
利用shift()函数获取上一行的频率值,和当前行的频率做比较,只保留当前行频率大于等于上一行频率的行,第一行无上一行数据默认保留。
完整代码示例
import pandas as pd import numpy as np # 假设你的已按time_tag排序的DataFrame变量名为df # 生成筛选掩码:当前行freq >= 上一行freq,第一行自动满足条件 mask = df['freq'] >= df['freq'].shift(1).fillna(-np.inf) # 可选:规避浮点数精度误差,替换为以下掩码,1e-9可根据你的频率精度调整 # mask = (df['freq'] - df['freq'].shift(1).fillna(-np.inf)) >= -1e-9 # 得到筛选后的结果 df_filtered = df[mask].copy()
示例处理效果
针对你给出的示例数据,处理后会保留以下3行:
freq snr time_tag 128 395.400902 115.737681 652492975 134 395.415043 115.858103 652492978 137 395.427460 115.805077 652492979
频率回退的第2行(索引118)、第5行(索引133)都会被删除,符合你的需求。
可选遍历实现(不推荐)
如果你坚持要通过遍历实现,也可以用以下代码:
keep_idx = [] last_freq = -np.inf for idx, row in df.iterrows(): if row['freq'] >= last_freq: keep_idx.append(idx) last_freq = row['freq'] df_filtered = df.loc[keep_idx].copy()
内容的提问来源于stack exchange,提问作者Omer Davidi
相关产品推荐
相关产品推荐

