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

如何用Python高效判断DataFrame中客户是否后续再次联系

高效实现DataFrame中判断客户后续是否再次联系

需求说明

已有按日期/时间排序的DataFrame,需新增Re-contact布尔列,标记当前行的客户电话号码在后续行中是否存在(对应Excel公式COUNTIFS(A2:A$5;A1)>0的逻辑),且需支持10万行的高效计算。

示例数据与预期结果

原始DataFrame:

DateTel
01-01-2023+33000000001
01-01-2023+33000000002
01-01-2023+33000000003
02-01-2023+33000000002
02-01-2023+33000000004

预期结果:

DateTelRe-contact
01-01-2023+33000000001False
01-01-2023+33000000002True
01-01-2023+33000000003False
02-01-2023+33000000002False
02-01-2023+33000000004False

高效实现方案

直接使用pandas的矢量化操作,避免Python循环(循环会导致O(n²)复杂度,完全无法处理10万行数据):

import pandas as pd

# 构造示例数据(实际使用时替换为你的DataFrame)
data = {
    'Date': ['01-01-2023', '01-01-2023', '01-01-2023', '02-01-2023', '02-01-2023'],
    'Tel': ['+33000000001', '+33000000002', '+33000000003', '+33000000002', '+33000000004']
}
df = pd.DataFrame(data)

# 核心逻辑:反转后标记重复项,再恢复原顺序
df['Re-contact'] = df[::-1]['Tel'].duplicated(keep='first')
# 恢复原顺序并重置索引
df = df[::-1].reset_index(drop=True)

方案原理

  1. 反转DataFrame:把原数据的行顺序倒转,原最后一行变成第一行,原第一行变成最后一行。
  2. 标记重复项:duplicated(keep='first')会标记除第一次出现外的所有重复值——对应反转后,原数据中先出现的Tel(如果后续还有相同值),在反转后会晚出现,因此会被标记为True。
  3. 恢复原顺序:再次反转DataFrame,此时Re-contact列的标记正好对应原数据中“当前行后续是否有相同Tel”的逻辑。

这种方法是基于pandas底层C实现的矢量化操作,时间复杂度为O(n),处理10万行数据仅需毫秒级时间。

原代码问题分析

你之前的嵌套循环存在两个核心问题:

  • 逻辑错误:循环中直接给整个Re-contact列赋值,会覆盖之前的结果,无法为每行单独标记。
  • 效率极低:嵌套循环的时间复杂度为O(n²),10万行数据需要执行10^10次操作,完全无法在合理时间内完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:40:59