Python Pandas:高效筛选指定食品日前后5天的用餐记录
无循环高效实现方案
核心思路
利用Pandas的矢量化操作+合并分组替代循环,底层优化的内置函数能大幅提升1GB级数据集的处理效率。
步骤实现
统一日期格式
先将两个DataFrame的日期列转换为datetime类型,确保时间计算准确:import pandas as pd # 转换日期列至datetime类型 df_food_day['food_day_date'] = pd.to_datetime(df_food_day['food_day_date']) df_eating['meal_date'] = pd.to_datetime(df_eating['meal_date'])按食品交叉合并
以「食品」为关联键,将两个数据集合并,保留所有国际食品日的记录:merged_df = pd.merge(df_food_day, df_eating, on='food', how='left')时间范围过滤
筛选出用餐日期在国际食品日当天及之前5天内的记录:# 计算时间窗口并过滤 time_window_start = merged_df['food_day_date'] - pd.Timedelta(days=5) merged_df = merged_df[merged_df['meal_date'].between(time_window_start, merged_df['food_day_date'])]分组聚合人员列表
按国际食品日的日期和食品分组,聚合出符合条件的人员列表(支持去重):# 聚合人员列表(默认保留所有记录) result = merged_df.groupby(['food_day_date', 'food'])['person'].agg(list).reset_index() # 若需去重(同一人多次食用的情况) result = merged_df.groupby(['food_day_date', 'food'])['person'].agg(lambda x: list(x.unique())).reset_index()
内存优化建议(针对1GB数据集)
如果内存紧张,可通过指定数据类型减少内存占用:
# 将字符串列转为category类型(类别有限时效果显著) df_food_day['food'] = df_food_day['food'].astype('category') df_eating['food'] = df_eating['food'].astype('category') df_eating['person'] = df_eating['person'].astype('category')
内容的提问来源于stack exchange,提问作者Pretzel Stands
相关产品推荐
相关产品推荐

