Python数据切片:如何筛选arrest_made为True条件对应的officer_id_hash 原代码失效
原代码问题排查
原代码无法得到预期结果的核心原因有三个:
- 运算符优先级逻辑完全偏差:Python中
&是位运算符,优先级高于相等判断==,原代码df['officer_id_hash'&'arrest_made' == 'True']实际会先对两个字符串'officer_id_hash'、'arrest_made'执行位与运算,从根上不符合pandas布尔索引的语法规则 - 索引结构混淆:pandas做条件切片时,行筛选条件、目标列选取是两个独立的索引位置,不能通过位操作把两个列名拼接成单个索引表达式
- 无关方法误用:
.max()是聚合类方法,作用是计算序列的最大值,和“提取所有满足条件的officer_id_hash值”的需求完全不匹配
正确实现方案
按照需求拆解为两步:①筛选所有arrest_made值为'True'的记录行;②从筛选结果中提取对应行的officer_id_hash字段值,通用的实现代码为:
# 提取所有符合条件的officer_id_hash序列 target_officer_ids = df.loc[df['arrest_made'] == 'True', 'officer_id_hash'] # 如果需要拿到纯Python格式的列表,可追加转换方法 target_officer_id_list = target_officer_ids.tolist()
实现逻辑说明:
- 使用
.loc索引器是pandas条件切片的标准写法,第一个参数传入行筛选的布尔条件,第二个参数传入需要提取的列名,避免索引歧义 - 额外注意事项:如果
arrest_made列实际存储的是布尔类型的真/假值,而非字符串格式的'True'/'False',需要把筛选条件调整为df['arrest_made'] == True,去掉True两侧的引号,否则会出现筛选结果为空的问题 - 多条件筛选的场景下才需要使用
&运算符,且每个独立筛选条件需要用括号包裹,例如同时筛选逮捕记录、警区为A区的写法为:df[(df['arrest_made'] == True) & (df['patrol_district'] == 'A区'), 'officer_id_hash']
内容的提问来源于stack exchange,提问作者yifei peng
相关产品推荐
相关产品推荐

