如何用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()方法,但该方法仅能检查同列重复,无法实现跨列判断,因此需要更合适的解决方案。
解决方案
可以通过以下步骤实现跨列的回头客判断:
- 用集合维护已出现过的所有客户姓名(集合查询效率远高于列表)
- 逐行检查当前行的非空客户是否有在历史集合中
- 每次检查后将当前行的非空客户加入集合,供后续行判断使用
完整代码如下:
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
相关产品推荐
相关产品推荐

