如何基于客户、产品编码及日期范围条件合并Pandas DataFrame
问题原因
你现有的代码仅完成了客户、产品编码两个字段的等值匹配,没有对支付日期是否落在特惠活动的有效区间做过滤,因此会生成大量不符合规则的匹配结果。
解决方案
方案1:小数据集适用(无需额外依赖)
先完成等值合并,再按日期区间过滤结果,逻辑简单易读:
import pandas as pd # 首先统一转换所有日期字段为datetime格式,避免字符串比较出错 df1['paydate'] = pd.to_datetime(df1['paydate']) df2['date_from'] = pd.to_datetime(df2['date_from']) df2['date_untill'] = pd.to_datetime(df2['date_untill']) # 先按等值字段合并 nef_df = pd.merge(df1, df2[['Customer', 'Product_code', 'date_from', 'date_untill']], on=['Customer', 'Product_code']) # 过滤出支付日期落在特惠有效期内的行 nef_df = nef_df[(nef_df['paydate'] >= nef_df['date_from']) & (nef_df['paydate'] <= nef_df['date_untill'])]
方案2:大数据集适用(减少内存占用)
如果两个数据集量级较大,等值合并会产生大量冗余临时行,可借助pandasql直接在关联阶段完成条件过滤,更高效:
import pandas as pd from pandasql import sqldf # 同样先统一日期字段格式 df1['paydate'] = pd.to_datetime(df1['paydate']) df2['date_from'] = pd.to_datetime(df2['date_from']) df2['date_untill'] = pd.to_datetime(df2['date_untill']) # 用SQL语法直接实现带范围条件的关联 sql = """ SELECT a.*, b.date_from, b.date_untill FROM df1 a LEFT JOIN df2 b ON a.Customer = b.Customer AND a.Product_code = b.Product_code AND a.paydate BETWEEN b.date_from AND b.date_untill """ nef_df = sqldf(sql)
内容的提问来源于stack exchange,提问作者user16760825
相关产品推荐
相关产品推荐

