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

如何用Pandas groupby筛选先禁呼后可呼的电话号码

筛选先出现禁呼标记后出现可呼标记的电话号码记录

需求说明

现有按时间顺序排列的Pandas DataFrame,包含两个核心字段:

  • called_to:电话号码
  • dispo:呼叫标记(c代表可呼,d代表禁呼)

需要筛选出满足以下条件的号码的完整呼叫记录:该号码的呼叫记录中先出现禁呼标记'd',之后又出现可呼标记'c'。

示例数据

创建示例DataFrame的代码:

import pandas as pd

edf = pd.DataFrame.from_dict({
    'called_to': ['11', '22', '33', '44', '11', '22', '33', '44', '11', '22', '33', '44', '11', '22', '33', '44'],
    'dispo': ['c', 'c', 'd', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'd', 'c', 'd', 'c', 'c']
})

解决方法

利用groupby结合自定义判断函数,通过filter方法直接筛选符合条件的分组记录:

步骤1:定义判断函数

该函数接收单个号码的分组数据,返回该组是否符合"先'd'后'c'"的条件:

def has_d_followed_by_c(group):
    # 获取当前组内所有'd'的索引位置
    d_positions = group[group['dispo'] == 'd'].index
    # 没有出现'd'的组直接排除
    if len(d_positions) == 0:
        return False
    # 取最后一次出现'd'的位置,检查之后是否存在'c'
    last_d_index = d_positions[-1]
    return (group.loc[last_d_index:]['dispo'] == 'c').any()

步骤2:执行分组筛选

调用groupby的filter方法,传入上述函数即可得到符合条件的所有记录:

valid_records = edf.groupby('called_to').filter(has_d_followed_by_c)
print(valid_records)

结果说明

运行代码后,输出结果为号码33和44的完整呼叫记录,与预期一致:

called_to dispo
2         33     d
3         44     c
6         33     c
7         44     c
10        33     c
11        44     d
14        33     c
15        44     c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:40:28