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

如何结合两个DataFrame查找按时间顺序访问指定分行对的客户

解决方案

实现逻辑

  1. 首先处理交易数据的日期字段,转成标准datetime格式避免字符串排序出错
  2. 按交易时间升序排序后,按客户ID分组,拿到每个客户的历史访问分行序列
  3. 遍历分行关联表的每一行分行对,匹配所有访问序列中符合要求的客户ID
  4. 最后将匹配到的客户ID拼接后写入新列,无匹配的填N/A

完整代码

import pandas as pd

# 1. 预处理交易数据日期,根据你的实际日期格式调整format参数,日/月/年用'%d/%m/%y'
df2['Date'] = pd.to_datetime(df2['Date'], format='%m/%d/%y')

# 2. 按时间排序后分组,得到每个客户的历史访问分行序列
cust_branch_seq = df2.sort_values('Date').groupby('customer ID')['Branch ID'].apply(list).to_dict()

# 3. 定义匹配函数
def match_customer(row):
    branch1 = row['Branch ID 1']
    branch2 = row['Branch ID 2']
    matched = []
    for cust_id, visit_list in cust_branch_seq.items():
        # 检查两个分行都在用户访问记录中
        if branch1 in visit_list and branch2 in visit_list:
            # 可选:校验先访问branch1再访问branch2,不需要的话可以删除下面这行判断
            if visit_list.index(branch1) < visit_list.index(branch2):
                matched.append(str(cust_id))
    return ','.join(matched) if matched else 'N/A'

# 4. 给分行关联表新增客户列
df1['Customer IDs'] = df1.apply(match_customer, axis=1)

大数量级优化方案

如果你的数据量较大,逐行遍历效率低,可以用预生成客户访问分行对的方式优化:

from itertools import combinations

# 预生成每个客户所有符合先后顺序的分行对集合
cust_valid_pairs = {}
for cust, visits in cust_branch_seq.items():
    pairs = set()
    # 生成所有有先后关系的分行对
    for i in range(len(visits)):
        for j in range(i+1, len(visits)):
            pairs.add((visits[i], visits[j]))
    # 如果不需要顺序校验,替换为pairs = set(combinations(visits, 2))即可
    cust_valid_pairs[cust] = pairs

# 匹配分行对
df1['Customer IDs'] = df1.apply(
    lambda row: ','.join([str(c) for c, p in cust_valid_pairs.items() if (row['Branch ID 1'], row['Branch ID 2']) in p]) or 'N/A',
    axis=1
)

常见调整说明

  • 不需要校验访问顺序的话,删除顺序判断逻辑,直接用set([branch1, branch2]).issubset(set(visit_list))判断即可,即可得到你示例中的包含12245的输出结果
  • 日期格式如果和示例不同,注意调整pd.to_datetime的format参数避免解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:48:02