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

如何基于ID和对应DATE条件优雅过滤pandas DataFrame?

基于ID和动态DATE条件过滤DataFrame的高效方法

测试数据与过滤条件

首先生成示例数据和随ID变化的DATE过滤条件:

import pandas as pd
import numpy as np

# 生成测试DataFrame
np.random.seed(42)
df = pd.DataFrame({
    'ID': ['A', 'B', 'C'] * 5,
    'DATE': pd.date_range(start='2023-01-01', periods=15, freq='D'),
    'VALUE': np.random.randn(15)
})

# 每个ID对应的DATE过滤阈值
filt = pd.DataFrame({
    'ID': ['A', 'B', 'C'],
    'MIN_DATE': pd.to_datetime(['2023-01-03', '2023-01-05', '2023-01-02'])
})

原循环实现方式

你之前通过循环拼接子DataFrame的实现如下:

filtered_dfs = []
for id_val in filt['ID']:
    min_date = filt.loc[filt['ID'] == id_val, 'MIN_DATE'].iloc[0]
    sub_df = df[(df['ID'] == id_val) & (df['DATE'] > min_date)]
    filtered_dfs.append(sub_df)

result_df = pd.concat(filtered_dfs)

优化后的优雅实现

以下两种矢量化方法比循环更高效、简洁:

方法1:Merge + 布尔索引

通过合并原DataFrame和过滤条件,直接用布尔索引筛选:

# 合并原DF与过滤条件
merged_df = df.merge(filt, on='ID', how='left')
# 筛选符合条件的行并清理临时列
result_df = merged_df[merged_df['DATE'] > merged_df['MIN_DATE']].drop(columns='MIN_DATE')

方法2:字典映射 + 布尔索引

将过滤条件转为字典,用map匹配每个ID的阈值后筛选:

# 构建ID到MIN_DATE的映射字典
id_min_date_map = filt.set_index('ID')['MIN_DATE'].to_dict()
# 直接筛选DATE大于对应ID阈值的行
result_df = df[df['DATE'] > df['ID'].map(id_min_date_map)]

输入输出示例

原DataFrame前5行:

ID       DATE     VALUE
0  A 2023-01-01  0.496714
1  B 2023-01-02 -0.138264
2  C 2023-01-03  0.647689
3  A 2023-01-04  1.523030
4  B 2023-01-05 -0.234153

过滤后结果:

ID       DATE     VALUE
3   A 2023-01-04  1.523030
6   A 2023-01-07 -0.469474
9   A 2023-01-10  0.314247
12  A 2023-01-13 -0.223675
7   B 2023-01-08  0.542560
10  B 2023-01-11 -0.087047
13  B 2023-01-14  1.150036
2   C 2023-01-03  0.647689
5   C 2023-01-06 -0.463418
8   C 2023-01-09 -0.234571
11  C 2023-01-12  1.037564
14  C 2023-01-15  0.931102

优势说明

这两种优化方法均为矢量化操作,避免了循环带来的性能瓶颈(数据量越大,优势越明显),同时代码更简洁易读,维护成本更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:03:30