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

如何在DataFrame中过滤偏离初始体重超10%的测量值及时间维度筛选

过滤DataFrame中体重异常值的实现方案

需求说明

  • 按ID分组,排除该ID下与初始体重(对应ID最早测量日期的体重)偏差超过10%的记录
  • 拓展需求:添加时间维度过滤,排除**指定时间段(如10天内)**与初始体重偏差超10%的记录(时间段外的偏差记录可保留)

原始数据

ID     Weight     Date
1      200        1/1
1      201        1/2
1      199        1/3
1      50         1/4
2      170        1/1
2      177        1/2
2      40         1/3
2      175        1/4

目标结果

ID     Weight     Date
1      200        1/1
1      201        1/2
1      199        1/3
2      170        1/1
2      177        1/2
2      175        1/4

实现方案

基础版本:仅基于体重偏差过滤

核心逻辑是按ID分组获取初始体重,再筛选体重处于初始体重90%-110%范围内的记录。

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'ID': [1, 1, 1, 1, 2, 2, 2, 2],
    'Weight': [200, 201, 199, 50, 170, 177, 40, 175],
    'Date': ['1/1', '1/2', '1/3', '1/4', '1/1', '1/2', '1/3', '1/4']
})

# 将日期转为datetime类型,确保能正确识别初始测量日期
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d')

# 按ID分组,提取每个ID的初始体重(最早日期对应的体重)
initial_weights = df.groupby('ID')\
    .apply(lambda x: x.loc[x['Date'].idxmin(), 'Weight'])\
    .rename('Initial_Weight')

# 合并初始体重到原表
df = df.merge(initial_weights, on='ID')

# 过滤体重在初始体重90%-110%范围内的记录
filtered_df = df[(df['Weight'] >= df['Initial_Weight'] * 0.9) & 
                 (df['Weight'] <= df['Initial_Weight'] * 1.1)]

# 整理结果,保留原列并排序
filtered_df = filtered_df[['ID', 'Weight', 'Date']]\
    .sort_values(by=['ID', 'Date'])\
    .reset_index(drop=True)

print(filtered_df)

运行后得到的结果与目标DataFrame完全一致,自动排除了ID1的50和ID2的40这两个异常值。

拓展版本:添加时间维度过滤

如果需要仅对初始日期后指定时间段内的记录应用体重偏差过滤,超出时间段的记录无论偏差多少都保留,可以按以下逻辑实现:

# 定义允许的时间窗口(单位:天)
time_window = 10

# 提取每个ID的初始日期
initial_dates = df.groupby('ID')['Date'].min().rename('Initial_Date')
df = df.merge(initial_dates, on='ID')

# 计算每条记录与初始日期的间隔天数
df['Days_Since_Initial'] = (df['Date'] - df['Initial_Date']).dt.days

# 过滤条件:要么超出时间窗口,要么在窗口内且体重符合偏差要求
filtered_df_time = df[
    (df['Days_Since_Initial'] > time_window) |
    ((df['Days_Since_Initial'] <= time_window) & 
     df['Weight'].between(df['Initial_Weight'] * 0.9, df['Initial_Weight'] * 1.1))
]

# 整理结果
filtered_df_time = filtered_df_time[['ID', 'Weight', 'Date']]\
    .sort_values(by=['ID', 'Date'])\
    .reset_index(drop=True)

print(filtered_df_time)

该逻辑的核心是:仅对初始测量10天内的记录做体重偏差校验,10天后的记录即使体重波动大也会被保留,适用于长期跟踪中允许体重自然变化的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:46:15