如何用Lambda与正则过滤Pandas DataFrame筛选指定日期前的S3路径
高效筛选Pandas DataFrame中S3路径日期早于指定值的行
你有一个包含数百万行数据的Pandas DataFrame,结构如下:
import pandas as pd data = {'s3_path': ['s3://mybucket/date=2023-10-26/f1.txt', 's3://mybucket/date=2023-10-25/f2.txt', 's3://mybucket/date=2023-10-24/f3.txt', 's3://mybucket/date=2023-10-23/f4.txt']} df = pd.DataFrame(data)
需求是筛选出s3_path中日期早于2023-10-24的行。
现有代码的问题
apply是逐行处理逻辑,面对数百万行数据时性能极差,完全不适合大规模数据集is_before函数存在逻辑错误:if cur_date < cutoff_date:后仅写了True但未返回,最终函数会默认返回None- 未实现从
s3_path中提取日期字符串并传入函数的逻辑
高效解决方案
利用Pandas的矢量化字符串操作和日期类型转换,全程避免逐行循环,能大幅提升处理速度,步骤如下:
提取日期字符串
使用str.extract配合正则表达式,一次性提取所有行中的日期片段:date_regex = r'date=(\d{4}-\d{2}-\d{2})' df['extracted_date'] = df['s3_path'].str.extract(date_regex, expand=False)转换为datetime类型
使用pd.to_datetime进行矢量化转换,比循环调用datetime.strptime效率高几个数量级:df['extracted_date'] = pd.to_datetime(df['extracted_date'], format='%Y-%m-%d')筛选目标行
通过布尔索引直接过滤DataFrame:cutoff_date = pd.to_datetime('2023-10-24') filtered_df = df[df['extracted_date'] < cutoff_date].drop(columns=['extracted_date'])
完整整合代码
import pandas as pd data = {'s3_path': ['s3://mybucket/date=2023-10-26/f1.txt', 's3://mybucket/date=2023-10-25/f2.txt', 's3://mybucket/date=2023-10-24/f3.txt', 's3://mybucket/date=2023-10-23/f4.txt']} df = pd.DataFrame(data) # 提取日期并转换类型 date_regex = r'date=(\d{4}-\d{2}-\d{2})' df['extracted_date'] = pd.to_datetime(df['s3_path'].str.extract(date_regex, expand=False), format='%Y-%m-%d') # 筛选并清理临时列 cutoff_date = pd.to_datetime('2023-10-24') filtered_df = df[df['extracted_date'] < cutoff_date].drop(columns=['extracted_date']) print(filtered_df)
输出结果:
s3_path 3 s3://mybucket/date=2023-10-23/f4.txt
额外优化建议
- 如果不需要保留临时列,可合并步骤减少内存占用:
cutoff_date = pd.to_datetime('2023-10-24') filtered_df = df[pd.to_datetime(df['s3_path'].str.extract(r'date=(\d{4}-\d{2}-\d{2})', expand=False)) < cutoff_date] - 对于超大规模数据集,可考虑使用
Dask等并行处理库进一步提升速度,常规场景下Pandas矢量化操作已足够高效。
内容的提问来源于stack exchange,提问作者user1330974
相关产品推荐
相关产品推荐

