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

如何用Pandas判断每行客户是否为跨列出现过的回头客

跨列判断回头客的解决方案

问题背景

现有按到店日期排序的客户姓名DataFrame如下:

import pandas as pd

df = pd.DataFrame(columns = ['Name1', 'Name2', 'Name3', 'Name4'],
                  data = [
['John Doe', 'Michael Miller', 'Elizabeth Wilson',  'Jennifer Williams'],
['Joe Bloggs', 'Jessica Davis', 'Alex Anderson', 'Olivia Martinez'], 
['Jane Smith', 'Emily Brown', 'Nicholas Robinson', None],
['Emily Brown', 'Sophia Clark', None, None ],
['Sarah Johnson', 'Daniel Garcia', 'Mia Taylor', 'William Davis'], 
['Michael Miller', None, None, None], 
['Nena Robins', 'Nicholas Robinson' ,'Grace Miller', None]
])

需求是判断每行是否存在曾出现在之前任意行任意姓名列的客户(即回头客),最终生成带RC列的结果表,期望输出如下:

Name1              Name2              Name3              Name4     RC
0        John Doe     Michael Miller   Elizabeth Wilson  Jennifer Williams  False
1      Joe Bloggs      Jessica Davis      Alex Anderson    Olivia Martinez  False
2      Jane Smith        Emily Brown  Nicholas Robinson                NaN  False
3     Emily Brown       Sophia Clark                NaN                NaN   True
4   Sarah Johnson      Daniel Garcia         Mia Taylor      William Davis  False
5  Michael Miller                NaN                NaN                NaN   True
6     Nena Robins  Nicholas Robinson       Grace Miller                NaN   True

用户尝试使用~df['Name1'].duplicated()方法,但该方法仅能检查同列重复,无法实现跨列判断,因此需要更合适的解决方案。

解决方案

可以通过以下步骤实现跨列的回头客判断:

  1. 用集合维护已出现过的所有客户姓名(集合查询效率远高于列表)
  2. 逐行检查当前行的非空客户是否有在历史集合中
  3. 每次检查后将当前行的非空客户加入集合,供后续行判断使用

完整代码如下:

import pandas as pd

# 初始化原始DataFrame
df = pd.DataFrame(columns=['Name1', 'Name2', 'Name3', 'Name4'],
                  data=[
                      ['John Doe', 'Michael Miller', 'Elizabeth Wilson', 'Jennifer Williams'],
                      ['Joe Bloggs', 'Jessica Davis', 'Alex Anderson', 'Olivia Martinez'],
                      ['Jane Smith', 'Emily Brown', 'Nicholas Robinson', None],
                      ['Emily Brown', 'Sophia Clark', None, None],
                      ['Sarah Johnson', 'Daniel Garcia', 'Mia Taylor', 'William Davis'],
                      ['Michael Miller', None, None, None],
                      ['Nena Robins', 'Nicholas Robinson', 'Grace Miller', None]
                  ])

# 初始化存储历史客户的集合和RC列结果
seen_customers = set()
rc_results = []

for idx, row in df.iterrows():
    # 提取当前行非空的客户姓名
    current_customers = [name for name in row if pd.notna(name)]
    # 判断当前行是否存在回头客
    has_returning = any(customer in seen_customers for customer in current_customers)
    rc_results.append(has_returning)
    # 将当前行客户加入历史集合
    seen_customers.update(current_customers)

# 将结果添加到DataFrame中
df['RC'] = rc_results

print(df)

代码说明

  • seen_customers集合:用于高效存储已出现的客户,成员查询操作时间复杂度为O(1),保证判断效率
  • any()函数:只要当前行有一个客户在历史集合中,就判定为存在回头客
  • 逐行更新集合:确保后续行能正确基于之前所有行的客户数据做判断

运行代码后即可得到符合需求的带RC列的结果表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:46:31