如何用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
相关产品推荐
相关产品推荐

