如何用Python高效判断DataFrame中客户是否后续再次联系
高效实现DataFrame中判断客户后续是否再次联系
需求说明
已有按日期/时间排序的DataFrame,需新增Re-contact布尔列,标记当前行的客户电话号码在后续行中是否存在(对应Excel公式COUNTIFS(A2:A$5;A1)>0的逻辑),且需支持10万行的高效计算。
示例数据与预期结果
原始DataFrame:
| Date | Tel |
|---|---|
| 01-01-2023 | +33000000001 |
| 01-01-2023 | +33000000002 |
| 01-01-2023 | +33000000003 |
| 02-01-2023 | +33000000002 |
| 02-01-2023 | +33000000004 |
预期结果:
| Date | Tel | Re-contact |
|---|---|---|
| 01-01-2023 | +33000000001 | False |
| 01-01-2023 | +33000000002 | True |
| 01-01-2023 | +33000000003 | False |
| 02-01-2023 | +33000000002 | False |
| 02-01-2023 | +33000000004 | False |
高效实现方案
直接使用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)
方案原理
- 反转DataFrame:把原数据的行顺序倒转,原最后一行变成第一行,原第一行变成最后一行。
- 标记重复项:
duplicated(keep='first')会标记除第一次出现外的所有重复值——对应反转后,原数据中先出现的Tel(如果后续还有相同值),在反转后会晚出现,因此会被标记为True。 - 恢复原顺序:再次反转DataFrame,此时
Re-contact列的标记正好对应原数据中“当前行后续是否有相同Tel”的逻辑。
这种方法是基于pandas底层C实现的矢量化操作,时间复杂度为O(n),处理10万行数据仅需毫秒级时间。
原代码问题分析
你之前的嵌套循环存在两个核心问题:
- 逻辑错误:循环中直接给整个
Re-contact列赋值,会覆盖之前的结果,无法为每行单独标记。 - 效率极低:嵌套循环的时间复杂度为O(n²),10万行数据需要执行10^10次操作,完全无法在合理时间内完成。
内容的提问来源于stack exchange,提问作者NPData
相关产品推荐
相关产品推荐

