Python中高效匹配不同长度DataFrame日期列并关联销售数据
高效实现日度数据到分钟级数据的匹配(替代嵌套循环)
核心思路
抛弃嵌套循环,利用pandas的向量化操作实现类似Excel VLOOKUP的匹配逻辑——这类操作经过底层C级优化,处理大数据集的效率远高于逐行循环。
步骤1:统一日期格式
先把两个DataFrame的Date列从字符串转为pandas日期类型,避免因格式差异导致匹配失败:
import pandas as pd # 转换日度数据的日期列(格式对应示例'2/1/2022':月/日/年) df_daily['Date'] = pd.to_datetime(df_daily['Date'], format='%m/%d/%Y') # 转换分钟级数据的日期列 df_minute['Date'] = pd.to_datetime(df_minute['Date'], format='%m/%d/%Y')
步骤2:选择高效匹配方法
方法一:使用pd.merge()(类似VLOOKUP精确匹配)
通过左连接将日度数据的Sales列匹配到分钟级数据中,保留分钟级数据的所有行:
# 仅保留df_daily中需要匹配的列,避免合并多余数据 df_merged = pd.merge(df_minute, df_daily[['Date', 'Sales']], on='Date', how='left')
how='left'确保df_minute的所有行都被保留,若某行找不到对应日期的销售额,Sales列会填充NaN,和VLOOKUP找不到匹配值的行为一致。
方法二:使用map()(字典映射,效率更优)
先将日度数据转为「日期-销售额」的字典,再通过映射快速填充分钟级数据:
# 构建日期到Sales的映射字典 sales_map = df_daily.set_index('Date')['Sales'].to_dict() # 映射到分钟级数据 df_minute['Sales'] = df_minute['Date'].map(sales_map)
- 字典查找是O(1)时间复杂度,处理14万行数据几乎瞬间完成,在多数场景下比
merge()更快。
效率差异说明
嵌套循环是逐行的Python级操作,存在大量性能开销;而merge()和map()都是向量化批量操作,基于底层C实现,处理大数据集时效率能提升几个数量级。
内容的提问来源于stack exchange,提问作者svlad4560
相关产品推荐
相关产品推荐

